| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
==[[言語まとめ C#]]==
[[言語 まとめ]] | [[C Sharp]] | [[C Sharp サンプルコード]] | [[Effective C Sharp 4.0]] | [[Universal Windows Platform]] | [[Visual Studio]] | [[プログラミングC Sharp 第7版]] |
{{amazon|4873116503}}
==準備==
===参照サイト===
====C#言語仕様[[言語]]仕様====
*[http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc C Sharp Language Specification version 3.0]
*[http://download.microsoft.com/download/B/6/C/B6C2DA74-08F9-4B18-BB10-CF6DB1A5CFE2/csharp_30_specification.doc 言語仕様 3.0]
=====Main メソッド=====
*オブジェクトを作成し、他のメソッドを呼び出す、プログラムのエントリ ポイント。
*[[C# ]] プログラムでは、エントリ ポイントは 1 つだけ。
*クラスまたは構造体の内部で宣言。静的である必要がある。パブリックにはしない。
*戻り値の型は、void か int
==データ型==
*[[C# ]] には値型と参照型がある。
*値型の変数は直接値を保持し、参照型はデータ自体への参照を保持する。
*値型は、組み込み数値型、列挙型、構造体型、null許容型に分かれる
|char
|-
|IEEE [[IE]]EE 浮動小数点数
|float double
|-
*型名はコンパイラによって生成され、ソース コード レベルでは利用できない
*作成するには、new 演算子とオブジェクト初期化子を使用
*共通言語ランタイムから見た匿名型は、object 共通[[言語]]ランタイムから見た匿名型は、object 以外の型にキャストできないことを除き、他の参照型と同じ
*プロパティの型はコンパイラによって推論される。
=====例=====
System.Type type = typeof(int);
====指定した複数の Object インスタンスが同一かどうかを判断====
boolean isSameRef isSame[[R]]ef = Object.ReferenceEquals[[R]]eferenceEquals(o1, o2);
===データ変換===
====@と二重引用符を使用====
*リテラル文字列は string 型であり、二重引用符で囲む形式と、@ と二重引用符で囲む形式の 2 通りある。
=====Raw文字列[[R]]aw文字列=====*@と二重引用符を使用を使用すると、エスケープシーケンスが処理されないため、正規表現やファイル名が記述しやすい。と二重引用符を使用を使用すると、エスケープシーケンスが処理されないため、[[正規表現]]やファイル名が記述しやすい。
*二重引用符を書く場合、2つ続ける
Console.WriteLine(@"c:\work\test.txt");
====文字列挿入($)====
*http://ufcpp.net/study/csharp/st_string.html#FormatableString
*[[C# ]] 6.0で追加
var formatted = $"({x}, {y})";
このような書き方を文字列挿入(string interpolation)といいます。 文字列挿入の結果は、単純に string.Format メソッドの呼び出しに置き替えられます。 例えば、最初の例は以下のコードと同じ意味なります。
====書式====
*[[C# 書式]]
==演算子==
*https://msdn.microsoft.com/ja-jp/library/6a71f45d.aspx
===?(null条件演算子)===
*https://msdn.microsoft.com/en-us/magazine/dn802602.aspx
*[[C#]]6.0から
=====これまで =====
if (value != null)
return value?.Substring(0, Math.Min(value.Length, length)) ?? 0;
===nameof===
*[[C#]]6.0から
*http://ufcpp.net/study/csharp/ap_ver6.html#nameof-operator
*変数、型、またはメンバーの単純な (修飾されていない) 文字列名を取得するのに使用
*列挙子オブジェクトに値を挿入する場合、または反復処理の終了を通知する場合に、iterator ブロック内で使用
*yield ステートメントは、メソッド、演算子、またはアクセサの本体として使用される iterator ブロック内でのみ使用できる
public static IEnumerable [[IE]]numerable Range(int size)
{
int result = 0;
public static void Main(string[] args)
{
foreach (int i in Range[[R]]ange(5))
{
System.Console.Write(i + "\t");
System.Console.WriteLine(num[10]);
}
catch (IndexOutOfRangeException IndexOutOf[[R]]angeException ioe)
{
System.Console.WriteLine("{0} : Exception Occured.", ioe);
}
catch (NullReferenceException Null[[R]]eferenceException nre)
{
throw (nre);
===クエリ式(LINQ クエリ式)===
*統合言語クエリ 統合[[言語]]クエリ (LINQ: Language-Integrated Query) は、クエリ機能を言語に直接統合する技術。は、クエリ機能を[[言語]]に直接統合する技術。*LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になる。を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた[[言語]]構成要素になる。
*一般的な式の規則と同じ規則がクエリ式に適用される。
=====例=====
string[] member = { "asano", "inoue", "uesugi", "okada", "onoue", "katou"};
IEnumerable[[IE]]numerable<string> choiced_member =
from member_name in member
where member_name.StartsWith("o")
DoExport((_, __) => { });
===式ツリー===
*式をデータ構造体として表すことができます。クエリ式を、SQL 式をデータ構造体として表すことができます。クエリ式を、[[SQL]] データベースなどの他のコンテキストで意味を持つコードに変換するために、LINQ プロバイダにより広く使用されています。
TODO
===名前空間を使用して多くのクラスを編成する===
*System が名前空間で、Console がこの名前空間のクラス
System.Console.WriteLine("Hello [[C# ]] World!");
=====using=====
*using キーワードを使用すると、完全な名前を記述する必要がなくなる
using System;
Console.WriteLine("Hello [[C# ]] World!");
===クラス名とメソッド名のスコープの管理を容易にする===
*基本クラス同名のメソッドを宣言する場合、new キーワードで明示する
*変数についても同様
public partial class HogeForm : System.[[Windows]].Forms.Form
{
// Forms の ShowDialog メソッドを隠す new を使って宣言する
*メソッド パラメーターは、値型であるか参照型であるかにかかわらず、ref で修飾できます。 値型が参照渡しにされるときには、ボックス化が行われません。
*ref のパラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方に明示的に ref のキーワードを使用する必要があります。
class RefExample[[R]]efExample
{
static void Method(ref int i)
}
===自動実装===
*自動実装するプロパティを使用すると、プロパティのアクセサで追加のロジックが必要ない場合に、プロパティ宣言がより簡単になる自動実装するプロパティを使用すると、プロパティのアクセサで追加の[[ロジック]]が必要ない場合に、プロパティ宣言がより簡単になる
public class Person
==イベント==
*[[.NET ]] Framework クラス ライブラリでは、イベントは EventHandler デリゲートと EventArgs 基本クラスに基づいています。
===パブリッシャとサブスクライバ===
*イベントを送信をクラスをパブリッシャ、イベントを受信するクラスをサブスクライバと呼ぶ
*event キーワードを使用して、パブリッシャー クラス内にイベントを宣言
*イベントは、宣言元 (パブリッシャー クラス) のクラスまたは構造体内でしか呼び出せない特殊なマルチキャスト デリゲート
*その他のクラスまたは構造体のイベントをサブスクライブすると、パブリッシャー [[その他]]のクラスまたは構造体のイベントをサブスクライブすると、パブリッシャー クラスがイベントを発生させるときにイベント ハンドラー メソッドが呼び出されます
public class SampleEventArgs
{
public delegate void SampleEventHandler(object sender, SampleEventArgs e);
public event SampleEventHandler SampleEvent;
protected virtual [[vi]]rtual void RaiseSampleEvent()
{
if (SampleEvent != null)
===[http://msdn.microsoft.com/ja-jp/library/w369ty8x.aspx EventHandler パターンに基づいてイベントを発行]===
*http://msdn.microsoft.com/ja-jp/library/w369ty8x.aspx
*ユーザー定義のクラス内のイベントは、値を返すデリゲートを含む、あらゆる有効なデリゲートを基にすることができますが、一般には、EventHandler を使用して、[[.NET ]] Framework のパターンを基にすることを推奨
=====パブリッシャー クラスとサブスクライバー クラスの両方から参照できるスコープで、カスタム データのクラスを宣言=====
*イベントと共にカスタム データを送信する必要がない場合は、この手順を省略
=====パブリッシャー クラス内にイベントを宣言=====
*カスタムの EventArgs クラスがない場合、Event 型は非ジェネリック バージョンの EventHandler デリゲートになります。
public event EventHandler RaiseCustomEvent[[R]]aiseCustomEvent;
*非ジェネリック バージョンの EventHandler を使用し、EventArgs から派生したカスタム クラスがある場合は、パブリッシャー クラス内でイベントを宣言
public event CustomEventHandler RaiseCustomEvent[[R]]aiseCustomEvent;
*ジェネリック バージョンを使用する場合、カスタム デリゲートは不要です。 代わりに、パブリッシャー クラス内でイベントの種類として EventHandler<CustomEventArgs> を指定
public event EventHandler<CustomEventArgs> RaiseCustomEvent[[R]]aiseCustomEvent;
=====使用例=====
public event CustomEventHandler RaiseCustomEvent[[R]]aiseCustomEvent;
namespace DotNetEvents
{
class Publisher
{
public event EventHandler<CustomEventArgs> RaiseCustomEvent[[R]]aiseCustomEvent;
public void DoSomething()
{
OnRaiseCustomEventOn[[R]]aiseCustomEvent(new CustomEventArgs("Did something"));
}
protected virtual [[vi]]rtual void OnRaiseCustomEvent(CustomEventArgs e)
{
EventHandler<CustomEventArgs> handler = RaiseCustomEvent[[R]]aiseCustomEvent;
if (handler != null)
{
{
id = ID;
pub.RaiseCustomEvent [[R]]aiseCustomEvent += HandleCustomEvent;
}
void HandleCustomEvent(object sender, CustomEventArgs e)
Console.WriteLine("Press Enter to close this window.");
Console.ReadLine[[R]]eadLine();
}
}
*ランタイムのキャストやボックス化操作のコストやリスクを負わずに他のクライアント コードで使用できる単一のクラスを記述できる
*コードの再利用性、タイプ セーフ性、およびパフォーマンスを最大化するために使用する
*[[.NET ]] Framework クラス ライブラリには、複数の新しいジェネリック コレクション クラスが System.Collections.Generic 名前空間に含まれています。これらのクラスは、System.Collections 名前空間の ArrayList などのクラスの代わりとして、できる限り使用する
public class GenelicList<T>
{
*ジェネリック クラスでは、値型に対するボックス化およびボックス化解除の操作を回避するために、IComparable よりも IComparable<T> などのジェネリック インターフェイスを使用することをお勧めします。
====単一の型に対する制約として、次のように複数のインターフェイスを指定できます。====
class Stack<T> where T : System.IComparable<T>, IEnumerable[[IE]]numerable<T>
{
}
====規定値(default)====
*変数を初期化するとき、 数値型の場合は 0 で、 参照型の場合は null で初期化する事がよくあります。 これら、0 や null などの値を既定値(default value)と呼びます。
*[[C# ]] ジェネリックでは、既定値を得るために、 default(Type) というキーワードを用意しています。
*default(Type) は、 数値型に対しては 0、 参照型に対しては null になります。 また、構造体に対しては、 構造体の全てのメンバーに対して 0 または null で初期化したものを与えます。
==アクセス修飾子==
*部分型定義では、クラス、構造体、またはインターフェイスを複数のファイルに分割することを定義できる
=====Form1.cs=====
using System.[[Windows]].Forms;
namespace TaskTraySample
{
}
#region [[Windows ]] フォーム デザイナで生成されたコード
/// <summary>
}
==アセンブリ==
*アセンブリは、[[.NET ]] Framework アプリケーションの基本ビルド ブロック*簡単な C# アプリケーションを構築する場合、Visual アプリケーションを構築する場合、[[Visual Studio ]] は、単一のポータブル実行可能 (PE) ファイルの形式 (具体的には EXE または DLL) でアセンブリを作成する
*リフレクションを使用すると、アセンブリに関する情報をプログラムによって取得できる
=====extern=====
|}
===[[正規表現]]===
====[http://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.aspx System.Text.RegularExpressions]====
}
====正規表現による置換[[正規表現]]による置換====
var output = System.Text.RegularExpressions.Regex.Replace(input, @"^[ ]", "");
===書式===
*開発者は同期処理と似たプログラム構造を維持したままこの非同期プログラムを実現することができます。
===非同期による応答性の改善===
*.NET Framework 4.5 および [[Windows ]] ランタイム の API の一覧には、非同期のプログラミングをサポートするメソッドが含まれます。
{|class="wikitable"
!アプリケーション領域
|-
|ファイルの処理
|StorageFile、StreamWriter、StreamReader、XmlReaderStorageFile、StreamWriter、Stream[[R]]eader、Xml[[R]]eader
|-
|イメージの処理
// Task<int> は整数値を返します
// - 非同期メソッドの名前は、慣例により「Async」というサフィックスで終わります。
async Task<int> AccessTheWebAsync[[Access]]TheWebAsync()
{
HttpClient client = new HttpClient();
// GetStringAsync は Task<string>を返す。
// getStringTask が待機しないため、AccessTheWebAsync が待機しないため、[[Access]]TheWebAsync は GetStringAsync からの最終結果に依存しない他の作業を続行できます。
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// await 演算子を使用してその進行を中断
// - AccessTheWebAsync [[Access]]TheWebAsync は次に、ダウンロードする文字列の長さを計算しますが、メソッドに文字列が戻されるまで、メソッドはその値を計算できません。 // - AccessTheWebAsync [[Access]]TheWebAsync を呼び出したメソッドにコントロールを戻します
// - getStringTask が完了すると制御が再開する
// - タスクは、ダウンロードされた文字列の長さの整数値を生成することの保証を表します
// return 文は 整数値を指定する
// どのメソッドもAccessTheWebAsync どのメソッドも[[Access]]TheWebAsync が桁数を参照するのを待つ
return urlContents.Length;
}

案内メニュー