サーチ…
前書き
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#プログラミングガイド)を参照してください 。
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を評価し、全体的な結果がfirstOperandとsecondOperandの両方が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
}
}
等価演算子のオーバーロード
等価演算子のオーバーロードだけでは不十分です。異なる状況下では、以下のすべてを呼び出すことができます:
-
object.Equals
とobject.GetHashCode
-
IEquatable<T>.Equals
(オプション、ボクシングを避けることができます) -
operator ==
およびoperator !=
(オプション、演算子の使用を許可)
Equals
オーバーライドする場合、 GetHashCode
もオーバーライドする必要があります。 Equals
実装する場合、特殊なケースが多数あります。異なるタイプのオブジェクトとの比較、自己との比較などです。
オーバーライドされない場合にはEquals
方法をし、 ==
演算子は、クラスや構造体のために動作が異なります。クラスの場合、参照は比較され、構造体の場合、プロパティの値はリフレクションを介して比較され、パフォーマンスに悪影響を与えることがあります。 ==
は、オーバーライドされない限り、構造体の比較には使用できません。
一般的に、等価演算は以下の規則に従わなければなりません:
- 例外をスローすることはできません。
- 再帰性:常に等しい(のために真ではないかもしれない
A
A
NULL
いくつかのシステムでの値)。 - トランジット性:
A
がB
に等しく、B
がC
に等しいならば、A
はC
等しい。 -
A
がB
に等しい場合、A
とB
は等しいハッシュコードを持つ。 - 継承ツリーの独立性:場合は
B
とC
のインスタンスであるClass2
から継承されたClass1
:Class1.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_trueとexpression_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:構造体)
char
、 int
、 float
などの組み込みプリミティブデータ型、 struct
、 enum
宣言されたユーザー定義型。デフォルト値は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:クラス)
任意のclass
、 interface
、配列またはデリゲート型。デフォルト値はnull
です。
default(object) // null
default(string) // null
default(MyClass) // null
default(IDisposable) // null
default(dynamic) // null
演算子の名前
variable
、 type
、または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条件演算子)
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++
はx
に1
を加えます
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++)
{
}
=>ラムダ演算子
=>
演算子は、代入演算子=
と同じ優先順位を持ち、右結合です。
ラムダ式を宣言するために使用され、 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();