非表示のC#ユーティリティ

stackoverflowからの質問を無料で翻訳することをお勧めします。 私はMSDNから何か(ほとんどロシア語版からの切り抜き)、ブログから何かを取りました。
私たち全員、C#開発者は、基本的なC#コマンドを知っています。 宣言、条件、ループ、演算子などを意味します。
ジェネリック匿名型ラムダlinqなどについて知っている人もいます。

しかし、ファンや専門家でさえ常に知っているとは限らない、C#の本当に秘密の機能やコツは何ですか?

キーワード


Michael Stumによるyield 反復子ブロックで使用され、列挙子オブジェクトの値を提供したり、反復の終了を報告したりします。
yield return <expression>; yield break ;

var by Michael Stum 。 変数を宣言します
var index;

using() statement by kokos。IDisposableオブジェクトが正しく使用されることを保証する便利な構文を提供します
using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
string s = null;
while((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}

readonly by kokos。readonlyキーワードは、フィールドに使用できる修飾子です。 フィールド宣言に読み取り専用修飾子が含まれる場合、そのようなフィールドへの値の割り当ては、宣言の一部として、または同じクラスのコンストラクターでのみ発生します。
class Age
{
readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}

マイク・ストーンによる

as / エド・スワングレンによる

as / is (改善) Rocketpantsによって

deathofratsによるdefault

global:: by pzycoman 。文脈依存グローバルキーワードがステートメントの前にある場合、グローバル名前空間を参照しますが、これはC#プログラムのデフォルト名前空間であり、他の名前は付けられていません。
class TestClass : global::TestApp { }

volatile by JakubŠturc。volatileキーワードは、同時に実行されている複数のスレッドによってフィールドを変更できることを示します。 volatileと宣言されたフィールドは、コンパイラーによる最適化に合格しません。コンパイラーは、別のストリームを介したアクセスを提供します。 これにより、フィールドで最も関連性の高い値が常に利用可能になります。
class VolatileTest
{
public volatile int i;


パブリックボイドテスト(int _i)
{
i = _i;
}
}

JakubŠturcによるextern alias 。場合によっては、同じ完全な型名を持つアセンブリの2つのバージョンを参照する必要があります。 たとえば、1つのアプリケーションでアセンブリの2つ以上のバージョンを使用する必要があります。 外部アセンブリエイリアスを使用すると、このエイリアスで指定されたルートレベルの名前空間内のラッパーに各アセンブリの名前空間を含めることができます。これにより、単一ファイルでそれらを使用できます。
/r:GridV1=grid.dll
/r:GridV2=grid20.dll
ここで、外部エイリアスGridV1およびGridV2が作成されます。 これらのエイリアスをプログラムで使用するには、externキーワードを使用してそれらにリンクします。 例。
externエイリアスGridV1;
externエイリアスGridV2;
GridV1 :: Gridはgrid.dllのグリッドコントロールであり、GridV2 :: Gridはgrid20.dllのグリッドコントロールです。

属性


Michael StumによるDefaultValueパラメータのデフォルト値を設定するための属性。

DannySmurfによる ObsoleteAttribute使用 ObsoleteAttributeれなくなったプログラム要素をマークします。

StuによるDebuggerDisplayAttribute :デバッガー変数のウィンドウでのクラスまたはフィールドの表示方法を定義します。

DebuggerBrowsable 。 デバッガー変数のウィンドウにメンバーを表示する方法と存在を決定します。

DebuggerStepThrough by bdukes 。 DebuggerStepThroughAttributeクラスを定義します。 このクラスは継承できません。

marxidadの ThreadStaticAttribute :静的フィールドの値が各スレッドに固有であることを示します。

Martin Clarkeの FlagsAttribute :列挙をフラグのセットであるビットフィールドとして扱うことができることを示します。
[SerializableAttribute]
[AttributeUsageAttribute(AttributeTargets.Enum, Inherited = false)]
[ComVisibleAttribute(true)]
public class FlagsAttribute : Attribute

AndrewBurnsによるConditionalAttribute

構文


?? オペレーターby kokos .Operator ?? これは、値NULLをサポートする演算子と呼ばれ、参照値タイプと同様に、NULL値タイプのデフォルト値を決定するために使用されます。 NULLでない場合は左のオペランドを返し、それ以外の場合は右のオペランドを返します。
class NullCoalesce
{
static int? GetNullableInt()
{
return null;
}


静的文字列GetStringValue()
{
nullを返します。
}

静的ボイドメイン()
{
// ?? 演算子の例。
int? x = null;

// y = x。ただし、xがnullの場合、y = -1。
int y = x ?? -1;

//メソッドの値を返すようにiを割り当てます
//戻り値はnullです。この場合、assign
// intのデフォルト値はiです。

int i = GetNullableInt()?? デフォルト(int);

string s = GetStringValue();
// ?? 参照型でも機能します。
// sのコンテンツを表示します。sがnullでない限り、
//この場合、「指定なし」を表示します。

Console.WriteLine(s ?? "Unspecified");
}
}

Nick Berardiによる番号の報告
Decimal = M
Float = F
Double = D


//たとえば
ダブルd = 30D;

キースによる1パラメーターラムダ
x => x.ToString() //simplify so many calls

キースによる自動プロパティ
Public int MyId { get; private set; }

キースによる名前空間エイリアス
using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;


web :: Control aWebControl = new web :: Control();
win :: Control aFormControl = new win :: Control();

Patrickによる@を使用した逐語的な文字列リテラル
"c:\\program files\\oldway"
@"c:\program file\newway"

(@文字は特殊文字を除外するのに役立ちます)

lfoustによるenum値。 enumはint値を持つ必要はありません。
public enum MyEnum : long
{
Val1 = 1,
Val2 = 2
}

任意の数値を列挙型にキャストできます。
MyEnum e = (MyEnum)123;

marxidadの event演算子:イベントキーワードを使用して、パブリッシャークラスでイベントを宣言します。
public class SampleEventArgs
{
public SampleEventArgs(string s) { Text = s; }
public String Text {get; private set;} // readonly
}
public class Publisher
{
// Declare the delegate (if using non-generic pattern).
public delegate void SampleEventHandler(object sender, SampleEventArgs e);


//イベントを宣言します。
パブリックイベントSampleEventHandler SampleEvent;

//保護された仮想メソッドでイベントをラップします
//派生クラスがイベントを発生できるようにします。
保護された仮想ボイドRaiseSampleEvent()
{
//()演算子を使用してイベントを発生させます。
SampleEvent(これ、新しいSampleEventArgs( "Hello"));
}
}

ポートマンによる文字列括弧のフォーマット

xanadontによるプロパティアクセサアクセシビリティ修飾子

JasonSによる三項演算子( :? 。 状態? first_expression:second_expression;

Binoj Antonyによるcheckedおよびunchecked演算子

言語機能


Brad BarkerによるNullable型Nullable型は、 System.Nullable(T)構造のインスタンスです。 null許容型は、その基本値型とオプションのnull値の値の正しい範囲を表すことができます。 たとえば、「NULL-Int32型」と呼ばれるNullableの場合、-2,147,483,648〜2,147,483,647またはnullの任意の値を割り当てることができます。
演算子を使用しますか?? 現在のnull値を持つnull許容型がintなどのnull許容型に割り当てられるときに使用されるデフォルト値を割り当てる x = null; int y = x ?? -1;

ブライアンリーヒーによるカレー

キースによる匿名型匿名型は、最初に型を明示的に決定することなく、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。 型名はコンパイラーによって作成され、ソースコードレベルでは使用できません。 プロパティのタイプは、コンパイラによって推測されます。 次の例は、AmountとMessageという2つのプロパティで初期化される匿名型を示しています。
var v = new { Amount = 108, Message = "Hello" };

__makeref __reftype __refvalue by Judah Himango

lomaxxによるオブジェクト初期化子 C#3.0の新規性の1つ...そのような置換を行うことができます。
Person p = new Person() {FirstName="John",LastName="Doe",Phone="602-123-1234",City="Phoenix"};

つまり、コンストラクターを使用せずにプロパティを定義します。

marxidadによる拡張メソッド拡張メソッドを使用すると、新しい派生型を作成、再コンパイル、または元の型を変更せずに、既存の型にメソッドを「追加」できます。 拡張メソッドは特別な種類の静的メソッドですが、拡張型のインスタンスメソッドであるかのように呼び出されます。 C#とVisual Basicで記述されたクライアントコードの場合、拡張メソッドの呼び出しと、実際に型で定義されているメソッドの呼び出しに目に見える違いはありません。
class ExtensionMethods2
{


静的ボイドメイン()
{
int [] ints = {10、45、15、39、21、26};
var result = ints.OrderBy(g => g);
foreach(結果の変数i)
{
System.Console.Write(i + "");
}
}
}
//出力:10 15 21 26 39 45

Jon Ericksonによるpartialメソッド 2つ以上のソースファイル間でクラスまたは構造インターフェイス、またはメソッドの定義を分割することができます。 各ソースファイルにはタイプまたはメソッドの定義が含まれており、アプリケーションのコンパイル時にすべての部分が結合されます。
public partial class Employee
{
public void DoWork()
{
}
}


パブリック部分クラスEmployee
{
public void GoToLunch()
{
}
}

John AsbeckによるC#プリプロセッサディレクティブ

このようなブロックで定義されたRobert Durgin #if debug -codeによるDEBUGプリプロセッサディレクティブは、デバッグ中にのみ実行されます。 開発時に例外のより詳細な結論を引き出すと便利です。

SefBknによるオペレーターのオーバーロード

ロブ・ゴフによって次のレベルに引き上げられたブール演算子

Visual Studioの機能


DannySmurfの スニペット Visual Studio開発環境には、「コードスニペット」と呼ばれる機能が含まれています。 コードスニペットは、すぐにコードに挿入できる既製のコードスニペットです。 たとえば、forコードスニペットは空のforループを作成します。 いくつかのコードが取り囲んでいます。 最初にコード行を選択し、次に選択した行が含まれるコードを選択できるようにします。 たとえば、必要なコード行を選択してforコードフラグメントをアクティブにすると、forループブロックが作成され、その中に選択されたコード行があります。 コードスニペットにより、プログラムの作成が高速化され、簡素化され、このプロセスの信頼性が向上します。
私見からテンプレートを試すことができます リシャーパー

枠組み


KiwiBastardの TransactionScope :コードブロックをトランザクション化します。 このクラスは継承できません。

Mutex by Mutex

System.IO.Path by ageektrapped。ファイルまたはディレクトリのパス情報を含むStringクラスのインスタンスで操作を実行します。 これらの操作はクロスプラットフォームで実行されます。

WeakReference by Juan Manuel 。オブジェクトを指すがガベージコレクターが削除できるようにWeakReference弱いリンクをWeakReferenceます。

メソッドとプロパティ


String.IsNullOrEmpty()メソッド:指定されたStringオブジェクトがnull(Visual BasicではNothing)か空の文字列かを示します。

List.ForEach()メソッド
using System;
using System.Collections.Generic;


クラスプログラム
{
静的ボイドメイン()
{
リスト<String>名=新しいリスト<String>();
names.Add( "Bruce");
names.Add( "Alfred");
names.Add( "Tim");
names.Add( "Richard");

//「Print」デリゲートを使用してリストの内容を表示します。
names.ForEach(印刷);

//以下は、Cの匿名デリゲート機能を示しています#
//リストの内容をコンソールに表示します。
names.ForEach(デリゲート(文字列名)
{
Console.WriteLine(名前);
});
}

private static void Print(string s)
{
Console.WriteLine(s);
}
}
/ *このコードは、次のような出力を生成します。
*ブルース
*アルフレッド
*ティム
*リチャード
*ブルース
*アルフレッド
*ティム
*リチャード
* /

Will DeanによるBeginInvoke()EndInvoke()メソッド

Nullable<T>.HasValueおよびNullable<T>. Value RismoによるNullable<T>. Valueプロパティ

John Sheehanの GetValueOrDefaultメソッド現在のNullable(T)オブジェクトの値または指定されたデフォルト値を取得します。

ヒントとコツ


ジョンによる大文字の比較 「C#を介したCLR」という本に基づいて、Microsoftは大文字比較のためにコードを最適化しました(たとえば、小文字ではありません)。

ダンカンスマートによるLINQBridge

Joel CoehoornによるParallel Extensionsレポートでは、Parallel FX 2008 CTPの主要コンポーネントについて説明し、Parallel FXの使用例を紹介しています。

オリジナル ©
PSコードの書式設定は非常に軽smされましたが、Habrは何かを聞きたくありません=(私のブログでは、すべてがほぼ正しく表示されています。

プログレッシブ

Source: https://habr.com/ru/post/J56279/


All Articles