サーチ…


前書き

C#では、 演算子は式または文の1つ以上のオペランドに適用されるプログラム要素です。インクリメント演算子(++)やnewなどの1つのオペランドをとる演算子は、単項演算子と呼ばれます。算術演算子(+、 - 、*、/)などの2つのオペランドを取る演算子は、2項演算子と呼ばれます。 1つの演算子、条件付き演算子(?:)は3つのオペランドをとり、C#の3つの3項演算子です。

構文

  • public static OperandType演算子operatorSymbol(OperandType operand1)
  • パブリックstatic OperandType演算子operatorSymbol(OperandType operand1、OperandType2 operand2)

パラメーター

パラメータ詳細
operatorSymbol オペレータが過負荷になっている、例えば+、 - 、/、*
オペランドタイプオーバーロードされた演算子によって返される型。
オペランド1 操作を実行する際に使用される最初のオペランド。
オペランド2 バイナリ操作を行うときに操作を実行する際に使用される第2オペランド。
ステートメント結果を返す前に操作を実行するために必要なオプションコード。

備考

すべての演算子はstatic methodsとして定義され、 virtualではなく、継承されません。

オペレータの優先順位

すべてのオペレータは、オペレータがどのグループに属しているか(同じグループのオペレータが同じ優先順位を持つ)に応じて、特定の「優先順位」を持っています。一部の演算子は他の演算子の前に適用されることを意味します。次に示すのは、優先順位順(最も高い順)に並べ替えられたグループ(それぞれの演算子を含む)のリストです。

  • 一次演算子

    • ab - メンバーアクセス。
    • a?.b - Null条件付きメンバーアクセス。
    • -> - メンバーアクセスと組み合わされたポインタ逆参照。
    • f(x) - 関数呼び出し。
    • a[x] - インデクサー。
    • a?[x] - Null条件付きインデクサ。
    • x++ - Postfixインクリメント。
    • x-- - 後置デクリメント。
    • new - インスタンス化の型。
    • default(T) - タイプTデフォルトの初期化された値を返します。
    • typeof - オペランドのTypeオブジェクトを返します。
    • checked - 数値のオーバーフローチェックを有効にします。
    • unchecked - 数値のオーバーフローチェックを無効にします。
    • delegate - デリゲートインスタンスを宣言して返します。
    • sizeof - 型オペランドのサイズをバイト単位で返します。
  • 単項演算子

    • +x -戻り値のx
    • -x - 数値の否定。
    • !x - 論理否定。
    • ~x -ビット単位の補数/デストラクタを宣言します。
    • ++x - プレフィックスインクリメント。
    • --x - プレフィックスの減少。
    • (T)x - 型キャスティング。
    • await - Task待つ。
    • &x -のアドレス(ポインタ)を返しますx
    • *x - ポインタ逆参照。
  • 乗法演算子

    • x * y - 乗算。
    • x / y - 除算。
    • x % y - モジュラス。
  • 加算演算子

    • x + y - 加算。
    • x – y - 減算。
  • ビットシフト演算子

    • x << y - 左にシフトビット。
    • x >> y - 右にシフトビット。
  • リレーショナル/タイプテスト演算子

    • x < y - より小さい。
    • x > y - より大きい。
    • x <= y - より小さいか等しい。
    • x >= y - より大きいか等しい。
    • is - 型互換性。
    • as - 型変換
  • 等価演算子

    • x == y - 等式。
    • x != y - 等しくない。
  • 論理AND演算子

    • x & y - 論理/ビット単位AND。
  • 論理XOR演算子

    • x ^ y - 論理/ビットごとの排他的論理和。
  • 論理OR演算子

    • x | y - 論理/ビットごとのOR。
  • 条件付きAND演算子

    • x && y - 論理ANDを短絡します。
  • 条件付きOR演算子

    • x || y - 論理ORを短絡します。
  • ヌル集約演算子

    • x ?? y - nullでない場合はx返します。それ以外の場合はy返します。
  • 条件付き演算子

    • x ? y : z - xがtrueの場合はy評価/返す。そうでなければ、 z評価する。

関連性のあるコンテンツ

オーバーロード可能演算子

C#では、 operatorキーワードを使用して静的メンバー関数を定義することにより、ユーザー定義型で演算子をオーバーロードすることができます。
次の例は、 +演算子の実装を示しています。

複素数を表すComplexクラスがある場合:

public struct Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }
}

このクラスに+演算子を使用するオプションを追加します。すなわち:

Complex a = new Complex() { Real = 1, Imaginary = 2 };
Complex b = new Complex() { Real = 4, Imaginary = 8 };
Complex c = a + b;

クラスの+演算子をオーバーロードする必要があります。これは、静的関数とoperatorキーワードを使用して行われます。

public static Complex operator +(Complex c1, Complex c2)
{
   return new Complex 
   { 
       Real = c1.Real + c2.Real,
       Imaginary = c1.Imaginary + c2.Imaginary 
   };
}

+-*/などの演算子はすべてオーバーロードされます。これには同じ型を返さない演算子も含まれます(たとえば、 ==!=はブール値を返すにもかかわらずオーバーロードされます)ここでは、ペアに関するルールも適用されます。

比較演算子は、ペアでオーバーロードする必要があります( <がオーバーロードされている場合は、 >もオーバーロードする必要があります)。

オーバーロード可能な演算子(およびオーバーロード不可能な演算子といくつかのオーバーロード可能な演算子に課された制限事項)の全リストは、 MSDN - オーバーロード可能演算子(C#プログラミングガイド)を参照してください

7.0

operator isオーバーロードはC#7.0のパターンマッチングメカニズムで導入されました。詳細については、 パターンマッチングを参照してください。

次のように定義されたCartesian

public class Cartesian
{
    public int X { get; }
    public int Y { get; }
}   

オーバーロード可能なoperator is例えば、 Polar

public static class Polar
{
    public static bool operator is(Cartesian c, out double R, out double Theta)
    {
        R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
        Theta = Math.Atan2(c.Y, c.X);
        return c.X != 0 || c.Y != 0;
    }
}

このように使用することができます

var c = Cartesian(3, 4);
if (c is Polar(var R, *))
{
    Console.WriteLine(R);
}

(この例はRoslyn Pattern Matching Documentationから取ったものです)

関係演算子

等しい

指定されたオペランド(引数)が等しいかどうかをチェックします。

"a" == "b"     // Returns false.
"a" == "a"     // Returns true.
1 == 0         // Returns false.
1 == 1         // Returns true.
false == true  // Returns false.
false == false // Returns true.

Javaとは異なり、等価比較演算子はネイティブに文字列で動作します。

等価比較演算子は、暗黙のキャストが一方から他方へ存在する場合、異なるタイプのオペランドで動作します。適切な暗黙的なキャストが存在しない場合は、明示的なキャストを呼び出すか、互換性のある型に変換するメソッドを使用できます。

1 == 1.0              // Returns true because there is an implicit cast from int to double.
new Object() == 1.0   // Will not compile.
MyStruct.AsInt() == 1 // Calls AsInt() on MyStruct and compares the resulting int with 1.

Visual Basic.NETとは異なり、等価比較演算子は等価代入演算子と同じではありません。

var x = new Object();
var y = new Object();
x == y // Returns false, the operands (objects in this case) have different references.
x == x // Returns true, both operands have the same reference.

代入演算子( = )と混同しないでください。

値型の場合、両方のオペランドの値が等しい場合、 true返します。
参照型のために、オペレータは、戻りtrue両方のオペランドが基準 (ない値)に等しい場合。ただし、文字列オブジェクトは値の等しいものと比較されます。

等しくない

指定されたオペランドが等しくないかどうかをチェックします。

"a" != "b"     // Returns true.
"a" != "a"     // Returns false.
1 != 0         // Returns true.
1 != 1         // Returns false.
false != true  // Returns true.
false != false // Returns false.

var x = new Object();
var y = new Object();
x != y // Returns true, the operands have different references.
x != x // Returns false, both operands have the same reference.

この演算子は、等号( == )演算子の結果と実質的に逆の結果を返します

より大きい

最初のオペランドが2番目のオペランドより大きいかどうかをチェックします。

3 > 5    //Returns false.
1 > 0    //Returns true.
2 > 2    //Return false.

var x = 10;
var y = 15;
x > y    //Returns false.
y > x    //Returns true.

未満

最初のオペランドが2番目のオペランドより小さいかどうかをチェックします。

2 < 4     //Returns true.
1 < -3    //Returns false.
2 < 2     //Return false.

var x = 12;
var y = 22;
x < y    //Returns true.
y < x    //Returns false.

等しいより大きい

最初のオペランドが2番目のオペランドと等しいかどうかをチェックします。

7 >= 8    //Returns false.
0 >= 0    //Returns true.

等しくない

最初のオペランドが2番目のオペランドと等しいかどうかをチェックします。

2 <= 4    //Returns true.
1 <= -3    //Returns false.
1 <= 1     //Returns true. 

短絡演算子

定義上、短絡論理演算子は、第1オペランドが式の全体的な結果を判定できない場合にのみ、第2オペランドを評価する。

それはあなたがfirstCondition && secondConditionとして&&演算子を使用している場合、それはfirstConditionが真である場合にのみ、secondConditionを評価し、全体的な結果がfirstOperandsecondOperandの両方がtrueに評価されている場合にのみtrueになりますofcourceだろう、ということを意味します。これは多くのシナリオで便利です。たとえば、リストに3つ以上の要素がありますが、リストがNullReferenceExceptionに実行されないように初期化されているかどうかをチェックする必要があります。あなたはこれを以下のように達成することができます:

bool hasMoreThanThreeElements = myList != null && mList.Count > 3;

mLList != nullが満たされるまで、 mList.Count> 3はチェックされません。

論理AND

&&は、標準ブールAND( & )演算子の短絡対応の部分です。

var x = true;
var y = false;

x && x // Returns true.
x && y // Returns false (y is evaluated).
y && x // Returns false (x is not evaluated).
y && y // Returns false (right y is not evaluated).

論理OR

||標準ブールOR( | )演算子の短絡対応の部分です。

var x = true;
var y = false;

x || x // Returns true (right x is not evaluated).
x || y // Returns true (y is not evaluated).
y || x // Returns true (x and y are evaluated).
y || y // Returns false (y and y are evaluated).

使用例

if(object != null && object.Property)
// object.Property is never accessed if object is null, because of the short circuit.
    Action1();
else
    Action2();

のサイズ

バイトの*型のサイズを保持するintを返します。

sizeof(bool)    // Returns 1.
sizeof(byte)    // Returns 1.
sizeof(sbyte)   // Returns 1.
sizeof(char)    // Returns 2.
sizeof(short)   // Returns 2.
sizeof(ushort)  // Returns 2.
sizeof(int)     // Returns 4.
sizeof(uint)    // Returns 4.
sizeof(float)   // Returns 4.
sizeof(long)    // Returns 8.
sizeof(ulong)   // Returns 8.
sizeof(double)  // Returns 8.
sizeof(decimal) // Returns 16.

* 安全なコンテキストでのみ、特定のプリミティブ型をサポートします。

安全でないコンテキストでは、 sizeofを使用して他のプリミティブ型や構造体のサイズを返すことができます。

public struct CustomType
{
    public int value;
}

static void Main()
{
    unsafe
    {
        Console.WriteLine(sizeof(CustomType)); // outputs: 4
    }
}

等価演算子のオーバーロード

等価演算子のオーバーロードだけでは不十分です。異なる状況下では、以下のすべてを呼び出すことができます:

  1. object.Equalsobject.GetHashCode
  2. IEquatable<T>.Equals (オプション、ボクシングを避けることができます)
  3. operator ==およびoperator != (オプション、演算子の使用を許可)

Equalsオーバーライドする場合、 GetHashCodeもオーバーライドする必要があります。 Equals実装する場合、特殊なケースが多数あります。異なるタイプのオブジェクトとの比較、自己との比較などです。

オーバーライドされない場合にはEquals方法をし、 ==演算子は、クラスや構造体のために動作が異なります。クラスの場合、参照は比較され、構造体の場合、プロパティの値はリフレクションを介して比較され、パフォーマンスに悪影響を与えることがあります。 ==は、オーバーライドされない限り、構造体の比較には使用できません。

一般的に、等価演算は以下の規則に従わなければなりません:

  • 例外をスローすることはできません。
  • 再帰性:常に等しい(のために真ではないかもしれないA A NULLいくつかのシステムでの値)。
  • トランジット性: ABに等しく、 BCに等しいならば、 AC等しい。
  • ABに等しい場合、 ABは等しいハッシュコードを持つ。
  • 継承ツリーの独立性:場合はBCのインスタンスであるClass2から継承されたClass1Class1.Equals(A,B) 、常にへの呼び出しと同じ値を返す必要がありますClass2.Equals(A,B)
class Student : IEquatable<Student>
{
    public string Name { get; set; } = "";

    public bool Equals(Student other)
    {
        if (ReferenceEquals(other, null)) return false;
        if (ReferenceEquals(other, this)) return true;
        return string.Equals(Name, other.Name);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;

        return Equals(obj as Student);
    }

    public override int GetHashCode()
    {
        return Name?.GetHashCode() ?? 0;
    }

    public static bool operator ==(Student left, Student right)
    {
        return Equals(left, right);
    }

    public static bool operator !=(Student left, Student right)
    {
        return !Equals(left, right);
    }
}

クラスメンバーオペレーター:メンバーアクセス

var now = DateTime.UtcNow;
//accesses member of a class.  In this case the UtcNow property.

クラスメンバー演算子:Null条件付きメンバーアクセス

var zipcode = myEmployee?.Address?.ZipCode;
//returns null if the left operand is null.  
//the above is the equivalent of:
var zipcode = (string)null;
if (myEmployee != null && myEmployee.Address != null)
    zipcode = myEmployee.Address.ZipCode;

クラスメンバー演算子:関数呼び出し

var age = GetAge(dateOfBirth);
//the above calls the function GetAge passing parameter dateOfBirth.

クラスメンバ演算子:集約オブジェクトの索引付け

var letters = "letters".ToCharArray();
char letter = letters[1];
Console.WriteLine("Second Letter is {0}",letter);
//in the above example we take the second character from the array
//by calling letters[1]
//NB: Array Indexing starts at 0; i.e. the first letter would be given by letters[0].

クラスメンバ演算子:Null条件付きインデックス

var letters = null;
char? letter = letters?[1];
Console.WriteLine("Second Letter is {0}",letter);
//in the above example  rather than throwing an error because letters is null
//letter is assigned the value null

「排他的」または「演算子」

"exclusive or"(短いXOR)の演算子は次のとおりです。^

この演算子は、指定されたboolのうち1つだけが真である場合にtrueを返します。

true ^ false   // Returns true
false ^ true   // Returns true
false ^ false  // Returns false
true ^ true    // Returns false

ビットシフト演算子

シフト演算子を使用すると、プログラマは、ビットをすべて左または右にシフトすることで整数を調整できます。次の図は、値を1桁左にシフトしたときの影響を示しています。

左方移動

uint value = 15;              // 00001111
 
uint doubled = value << 1;    // Result = 00011110 = 30
uint shiftFour = value << 4;  // Result = 11110000 = 240

右シフト

uint value = 240;             // 11110000
 
uint halved = value >> 1;     // Result = 01111000 = 120
uint shiftFour = value >> 4;  // Result = 00001111 = 15

暗黙のキャスト演算子と明示的なキャスト演算子

C#では、 explicitおよびimplicitキーワードを使用して、ユーザー定義の型で割り当ておよびキャストを制御できます。メソッドのシグネチャは次の形式をとります。

public static <implicit/explicit> operator <ResultingType>(<SourceType> myType)

このメソッドはそれ以上引数を取ることはできませんし、インスタンスメソッドにすることもできません。ただし、内部で定義された型のプライベートメンバーにアクセスすることはできます。

implicit explicitキャストとexplicitキャストの両方の例:

public class BinaryImage 
{
    private bool[] _pixels;

    public static implicit operator ColorImage(BinaryImage im)
    {
        return new ColorImage(im);
    }

    public static explicit operator bool[](BinaryImage im)
    {
        return im._pixels;
    }
}

次のキャスト構文を許可する:

var binaryImage = new BinaryImage();
ColorImage colorImage = binaryImage; // implicit cast, note the lack of type 
bool[] pixels = (bool[])binaryImage; // explicit cast, defining the type

キャスト演算子があなたのタイプから行くとあなたのタイプ行く、両方の方法を働かせることができます。

public class BinaryImage
{
    public static explicit operator ColorImage(BinaryImage im)
    {
        return new ColorImage(im);
    }

    public static explicit operator BinaryImage(ColorImage cm)
    {
        return new BinaryImage(cm);
    }
}

最後に、型階層内のキャストに関係する可能性があるasキーワードは、この状況で無効です。 explicitまたはimplicitキャストのいずれかを定義した後でも、次のことはできません。

ColorImage cm = myBinaryImage as ColorImage;

コンパイルエラーが発生します。

代入を持つ2項演算子

C#には、演算子の結果を評価し、その結果を元の変数に代入するために、 =記号と組み合わせることができる複数の演算子があります。

例:

x += y

〜と同じです

x = x + y

代入演算子:

  • +=
  • -=
  • *=
  • /=
  • %=
  • &=
  • |=
  • ^=
  • <<=
  • >>=

? :三項演算子

ブール式の値に応じて2つの値のいずれかを返します。

構文:

condition ? expression_if_true : expression_if_false;

例:

string name = "Frank";
Console.WriteLine(name == "Frank" ? "The name is Frank" : "The name is not Frank");

三項演算子は右結合であり、複合三項式を使用することができます。これは、親三元方程式の真または偽の位置のいずれかに追加の三項方程式を加えることによって行われる。読みやすくするために注意する必要がありますが、これは場合によっては簡略化すると便利です。

この例では、複合三項演算はclamp関数を評価し、範囲内にある場合は現在の値を返し、範囲以下の場合はmin値を返し、範囲を超えている場合はmax値を返します。

light.intensity = Clamp(light.intensity, minLight, maxLight);

public static float Clamp(float val, float min, float max)
{
    return (val < min) ? min : (val > max) ? max : val;
}

三項演算子は、次のようにネストすることもできます。

a ? b ? "a is true, b is true" : "a is true, b is false" : "a is false"

// This is evaluated from left to right and can be more easily seen with parenthesis:

a ? (b ? x : y) : z

// Where the result is x if a && b, y if a && !b, and z if !a

複合3値ステートメントを記述するときは、読みやすさを向上させるために括弧やインデントを使用するのが一般的です。

expression_if_trueexpression_if_falseの型は同一でなければならないか、または一方から他方への暗黙の変換が必要です。

condition ? 3 : "Not three"; // Doesn't compile because `int` and `string` lack an implicit conversion.

condition ? 3.ToString() : "Not three"; // OK because both possible outputs are strings.

condition ? 3 : 3.5; // OK because there is an implicit conversion from `int` to `double`. The ternary operator will return a `double`.

condition ? 3.5 : 3; // OK because there is an implicit conversion from `int` to `double`. The ternary operator will return a `double`.

タイプとコンバージョンの要件は、あなた自身のクラスにも適用されます。

public class Car
{}

public class SportsCar : Car
{}

public class SUV : Car
{}

condition ? new SportsCar() : new Car(); // OK because there is an implicit conversion from `SportsCar` to `Car`. The ternary operator will return a reference of type `Car`.

condition ? new Car() : new SportsCar(); // OK because there is an implicit conversion from `SportsCar` to `Car`. The ternary operator will return a reference of type `Car`.

condition ? new SportsCar() : new SUV(); // Doesn't compile because there is no implicit conversion from `SportsCar` to SUV or `SUV` to `SportsCar`. The compiler is not smart enough to realize that both of them have an implicit conversion to `Car`.

condition ? new SportsCar() as Car : new SUV() as Car; // OK because both expressions evaluate to a reference of type `Car`. The ternary operator will return a reference of type `Car`.

タイプ

型のSystem.Typeオブジェクトを取得しSystem.Type

System.Type type = typeof(Point)        //System.Drawing.Point      
System.Type type = typeof(IDisposable)  //System.IDisposable
System.Type type = typeof(Colors)       //System.Drawing.Color
System.Type type = typeof(List<>)       //System.Collections.Generic.List`1[T]

実行時の型を取得するには、 GetTypeメソッドを使用して、現在のインスタンスのSystem.Typeを取得します。

演算子typeofは、コンパイル時に指定されるパラメータとして型名をとります。

public class Animal {} 
public class Dog : Animal {}

var animal = new Dog();

Assert.IsTrue(animal.GetType() == typeof(Animal)); // fail, animal is typeof(Dog) 
Assert.IsTrue(animal.GetType() == typeof(Dog));    // pass, animal is typeof(Dog)
Assert.IsTrue(animal is Animal);                   // pass, animal implements Animal

デフォルト演算子

値の型(T:構造体)

charintfloatなどの組み込みプリミティブデータ型、 structenum宣言されたユーザー定義型。デフォルト値はnew T()です。

default(int)            // 0
default(DateTime)       // 0001-01-01 12:00:00 AM
default(char)           // '\0' This is the "null character", not a zero or a line break.
default(Guid)           // 00000000-0000-0000-0000-000000000000
default(MyStruct)       // new MyStruct()

// Note: default of an enum is 0, and not the first *key* in that enum
// so it could potentially fail the Enum.IsDefined test
default(MyEnum)         // (MyEnum)0

参照型(T:クラス)

任意のclassinterface 、配列またはデリゲート型。デフォルト値はnullです。

default(object)         // null
default(string)         // null
default(MyClass)        // null
default(IDisposable)    // null
default(dynamic)        // null

演算子の名前

variabletype 、またはmemberの非修飾名を表す文字列を返します。

int counter = 10;
nameof(counter); // Returns "counter"
Client client = new Client();
nameof(client.Address.PostalCode)); // Returns "PostalCode"

nameof演算子はC#6.0で導入されました。コンパイル時に評価され、返された文字列値はコンパイラによってインラインで挿入されるため、定数文字列を使用できるほとんどの場合に使用できます( switch文、アトリビュートなどのcaseラベルなど)。 )。これは、例外や属性、MVCアクションリンクなどを発生させたりロギングする場合などに便利です。

? (Null条件演算子)

6.0

C#6.0導入されたNull条件演算子?. NullReferenceExceptionをスローするのではなく、左側の式がnullと評価された場合は、すぐにnull返しnull 。その左側が非null値と評価される場合、それは通常のように扱われ.オペレーター。 null返す可能性があるので、その戻り値の型は常にNULL可能型です。これは、構造体またはプリミティブ型の場合、 Nullable<T>ラップされることを意味します。

var bar = Foo.GetBar()?.Value; // will return null if GetBar() returns null
var baz = Foo.GetBar()?.IntegerValue; // baz will be of type Nullable<int>, i.e. int?

これは、イベントを発生させるときに便利です。通常は、ifステートメントでイベント・コールをラップしてnullをチェックし、その後イベントを発生させる必要があります。これにより、競合状態が発生する可能性があります。 Null条件演算子を使用すると、次のように修正できます。

event EventHandler<string> RaiseMe;
RaiseMe?.Invoke("Event raised");

PostfixとPrefixのインクリメントとデクリメント

PostfixインクリメントX++x1を加えます

var x = 42;
x++;
Console.WriteLine(x); // 43

後置デクリメントX--は1を引く

var x = 42
x--; 
Console.WriteLine(x); // 41

++xは接頭辞インクリメントと呼ばれ、xの値をインクリメントしてからxを返し、 x++x++の値を返し、インクリメントします

var x = 42;
Console.WriteLine(++x); // 43
System.out.println(x); // 43

while

var x = 42;
Console.WriteLine(x++); // 42
System.out.println(x); // 43

どちらもforループで共通に使用されます

for(int i = 0; i < 10; i++)
{
}

=>ラムダ演算子

3.0

=>演算子は、代入演算子=と同じ優先順位を持ち、右結合です。

ラムダ式を宣言するために使用され、 LINQクエリでも広く使用されています。

string[] words = { "cherry", "apple", "blueberry" };

int shortestWordLength = words.Min((string w) => w.Length); //5

LINQの拡張機能やクエリで使用する場合、通常、オブジェクトの型はコンパイラによって推測されるのでスキップできます。

int shortestWordLength = words.Min(w => w.Length); //also compiles with the same result

ラムダ演算子の一般的な形式は次のとおりです。

(input parameters) => expression

ラムダ式のパラメータは、 =>演算子の前に指定され、実行される実際の式/文/ブロックは演算子の右にあります。

// expression
(int x, string s) => s.Length > x

// expression
(int x, int y) => x + y

// statement
(string x) => Console.WriteLine(x)

// block
(string x) => {
        x += " says Hello!";
        Console.WriteLine(x);
    }

この演算子を使用すると、明示的なメソッドを記述することなく、デリゲートを簡単に定義できます。

delegate void TestDelegate(string s);

TestDelegate myDelegate = s => Console.WriteLine(s + " World");

myDelegate("Hello");

の代わりに

void MyMethod(string s)
{
    Console.WriteLine(s + " World");
}

delegate void TestDelegate(string s);

TestDelegate myDelegate = MyMethod;

myDelegate("Hello");

代入演算子 '='

代入演算子=左オペランドの値を右オペランドの値に設定し、その値を返します。

int a = 3;     // assigns value 3 to variable a
int b = a = 5; // first assigns value 5 to variable a, then does the same for variable b
Console.WriteLine(a = 3 + 4); // prints 7

??ヌル統合演算子

ヌル合体演算子?? NULLでないときは左辺を返します。 nullの場合は、右辺を返します。

object foo = null;
object bar = new object();

var c = foo ?? bar;
//c will be bar since foo was null

??演算子はチェインされ、 ifチェックの除去が可能です。

//config will be the first non-null returned.
var config = RetrieveConfigOnMachine() ??
             RetrieveConfigFromService() ??
             new DefaultConfiguration();


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow