SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
Introduction to the C# Language


   M2 Akihiro Nakashima (Sato Lab.)
勉強会の構成
1時間目・・・C#の基礎
 簡単にスライドで基礎を紹介

 Javaとの違いを中心に・・・


2時間目・・・P/Invoke実習(Live Coding!?)
 OpenCVの超簡易ラッパ開発を題材として、

 P/Invoke(DLLの利用)を紹介
1時間目:C#の基礎?
しょーじきいってJavaとおなじ

基本的なところ
どんな言語?
• Delphi開発者のAnders Hejlsbergが開発
 – C/C++風でDelphiの構文を引き継いでいる
 – でも知らない人(自分)にはJava風に見える


• 割と実装効率主義

• Visual C#のインテリセンスが超賢い
 – ついでにコンパイルも速い
if for while などなど
• Javaと同じ!!(本当に)

• 文字列型(string)も==で比較可能
 – 演算子のオーバーロードが存在
 – Equalsもある


• ちなみにint,doubleなどにもメソッドあり
 – Parse,ToStringなど(ラッパークラスはない)
foreach
• コレクション(List,配列など)から、
  要素を1つずつ取り出して操作する構文
 List<double> list = new List<double> { 1, 3, 5, 7, 9 } ;

 foreach (double d in list)
 {
   Console.WriteLine(”{0}^2 = {1}”, d, d*d);
 }

• Javaでいうと拡張for文
 – 割と便利
クラスと構造体
• だいたいJavaと同じ
 – 継承、実装の書き方はC++に近い
   • class SomeClass : ClassA, IDisposable
• classとstructの違い
 – classは参照渡し、structは値渡し
 – どちらもobject(System.Object)を継承
 – classはnull許容、structはnull非許容
 – structは割と制約が多い
例外処理
• 基本的にJavaと同じ
 – ただしthrows指示は存在しない
 – ぬるぽ→NullReferenceException
• 男らしいcatchが可能
try
{
  // some process
}
catch
{
  // 引数を取らず、ただ例外があったことのみを知る
}
getter/setterなんて面倒じゃん?

プロパティ
プロパティとは
• クラス外部からはフィールドのように
  利用でき、クラス内部ではメソッドの
  ように記述できるもの

• C++、Javaでいうアクセサの簡単版
 – カプセル化、隠蔽を実現
Javaで書くと・・・
  private int number;
  public int getNumber()
  {
    return number;
  }

  // 知らない人の変更は許可しない
  protected void setNumber(int n)
  {
     number = n;
  }

• get○○、set○○というメソッドを実装
C#で書くと・・・
private int number;
public int Number
{
  get
  {                    getは取得する際の処理を記述
     return number;
  }
  protected set
  {                    setは設定する際の処理を記述
     number = value;
                       valueは右辺値
  }
}
使う側は?
  // クラスの外だと・・・

  int num = instance.Number; // OK!!
  instance.Number = 3;       // Compile Error!!



  // クラスの内部(or継承先の内部)だと・・・

  int num = Number;         // OK!!
  Number = 3;               // OK!!

• フィールドのように見えるがメソッド的なもの
略記法
  public int Number
  {
    get;
    protected set;
  }


• numberにあたるものが内部で定義される
C/C++の資産を使いたいじゃないか

P/Invoke
P/Invokeとは
• Platform Invoke
  – System.Runtime.InteropServices


• C/C++のDLLなど(Win32 APIも)を
  呼び出すための仕組み

• P/Invoke宣言を書くことでC#の
  メソッドとして取り込むことができる
P/Invoke宣言

読み込むDLL名を指定               マルチバイトとUnicodeもおまかせ

 [DllImport(”user32.dll”, CharSet=CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, string text,
string caption, int options);       ポインタはIntPtr



static externを指定して、プロトタイプ宣言のように記述



• C++のlongはC#のlongでない!注意!
   – C++・・・32bit, C#・・・64bit
使う側
宣言を書いたクラス

PInvoke.MessageBox(IntPtr.Zero, ”本文”, ”見出し”, 0);
                 NULLのかわり                 MB_OK




• staticなメソッドとして呼べる
• 宣言はstaticなクラスにまとめると便利
ちょっと不気味?で便利な機能たち

闇魔法
delegate
• 関数ポインタのようなもの
• 汎用delegate型が便利
 – Action<T>,Func<T,TResult>,…


• メソッドに渡して利用などできる
匿名delegate
• delegateを簡単に処理を記述する
intを引数に取る汎用delegate

Action<int> process =
delegate(int n) 引数(無いときはカッコごと省略可)
{
   Console.WriteLine(“{0}^2 = {1}”, n, n*n);
};

process(3); // ←メソッドのように呼び出せる
ラムダ式
• もっと簡単にdelegateを記述する

          引数の後に      => をつなげて文を書く(ブロックも可)
Action<int> process = (n) => Console.WriteLine(“{0}^2 = {1}”, n, n*n);

process(3); // ←メソッドのように呼び出せる



• メソッドに簡単な処理を渡すとき便利
LINQ
• Language Integrated Query
• SQLっぽくコレクションを扱える
   – XMLやDBに対しても使えるらしい
DirectoryInfo info = new DirectoryInfo(dirPath);
foreach (var s in from p in info.GetFiles()      処理するコレクション
                  where p.Extension == “.html” htmlファイルのみ
                  orderby p.LastWriteTime        最終更新でソート
                  select p.FullName)             ファイルパスを得る
{
  Console.WriteLine(s); htmlファイルを最終更新でソートして表示
}
拡張メソッド
• クラスに後付けでメソッドを追加した
  ように見せかけることのできる機能
                       第一引数はthisを付けて、オブジェクト自身を受ける

public static int Square(this int num)
{
  return (num * num);
}

int num = 3;
                       あたかもintのメソッドのように呼び出せる

int squared = num.Square();        // squared = 9
2時間目:P/Invoke実習

   ぐだぐだの予感?

Weitere ähnliche Inhalte

Was ist angesagt?

2011年10月21日
2011年10月21日2011年10月21日
2011年10月21日
nukaemon
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
 
Boost.python
Boost.pythonBoost.python
Boost.python
fate_fox
 

Was ist angesagt? (20)

C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 
2011年10月21日
2011年10月21日2011年10月21日
2011年10月21日
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
TF-IDFで文書カテゴリ分類
TF-IDFで文書カテゴリ分類TF-IDFで文書カテゴリ分類
TF-IDFで文書カテゴリ分類
 
Ilerpg Study 006
Ilerpg Study 006Ilerpg Study 006
Ilerpg Study 006
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
C言語講習会1
C言語講習会1C言語講習会1
C言語講習会1
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Ilerpg Study 003
Ilerpg Study 003Ilerpg Study 003
Ilerpg Study 003
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
Ilerpg Study 004
Ilerpg Study 004Ilerpg Study 004
Ilerpg Study 004
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Boost.python
Boost.pythonBoost.python
Boost.python
 
Ilerpg Study 002
Ilerpg Study 002Ilerpg Study 002
Ilerpg Study 002
 
C# linq入門 意図編
C# linq入門 意図編C# linq入門 意図編
C# linq入門 意図編
 

Ähnlich wie C#勉強会

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
Takako Miyagawa
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
do_aki
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 

Ähnlich wie C#勉強会 (20)

C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
第1回python勉強会
第1回python勉強会第1回python勉強会
第1回python勉強会
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
20010901
2001090120010901
20010901
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
Linq To Fun
Linq To FunLinq To Fun
Linq To Fun
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
今からでも遅くないC#開発
今からでも遅くないC#開発今からでも遅くないC#開発
今からでも遅くないC#開発
 

C#勉強会