|
■No83115 (rotto さん) に返信 > intは構造体の型の変数にそのまま値が格納できます。
これは .NET 側の仕様と言うよりも、整数型の数値リテラルとして 言語仕様レベルで定義されているためだと思います。
整数値の代入は、IL レベルで専用命令が用意されているので、 整数リテラルが用意されていた方が都合が良かったのでしょう。
たとえば deciemal 構造体の場合などは、 decimal a = 1.234M; decimal b = 1.23400m;
Console.WriteLine(a); // 1.234 Console.WriteLine(b); // 1.23400 Console.WriteLine(a == b); // True Console.WriteLine(a.ToString() == b.ToString()); // False のように、M/m サフィックスによるリテラル表記が用意されてはいます。
といっても、Visual Studio のデザイナコードにおいては、コードジェネレーターが a = new decimal(new int[] {1234, 0, 0, 196608}); のようにコンストラクタを用いた記述を生成するようになっていますけれどね。
あるいは DateTiem 構造体を例に挙げてみると: Visual Basic には「日付型リテラル」が存在しており、 Dim dt1 As DateTime = #3/7/2017 8:45:00 AM# のような記述ができますが、C# にはそのようなリテラルが存在しないため DateTime 構造体のコンストラクタや Parse/ParseExact メソッドなどを用いて DateTime dt2 = new DateTime(2017, 3, 7, 8, 45, 0); DateTime dt3 = DateTime.Parse("2017-03-07 08:45:00"); と書かねばなりません。
> 例えば、下記のように自作の構造体を作成したとします。
オブジェクト初期化子を用いて、 ItumonoKozoutai kouzoutai = new ItumonoKozoutai() { I = 111, k = 222 }; のように指定することはできます(C# 3.0/VS2008 以上)。
それ以前のバージョンだと、ItumonoKozoutai 型を返す静的メソッドか、 引数付きコンストラクタを、ItumonoKozoutai 構造体に用意することで、 ItumonoKozoutai kouzoutai1 = new ItumonoKozoutai(333, 444); ItumonoKozoutai kouzoutai2 = ItumonoKozoutai.Create(555, 666); などの記述が可能になります。
> フィールドに値を格納するか、プロパティを介して > フィールドに値を格納します。 たとえば、ItumonoKozoutai 構造体にて
public static implicit operator ItumonoKozoutai(ulong qword) { return new ItumonoKozoutai() { I = (int)(qword >> 32), k = (int)(qword & uint.MaxValue) }; }
のような型変換演算子をオーバーロードさせておけば、 // 下記は、X = 0xFEDCBA98, k = 0x76543210 の代入として扱われる ItumonoKozoutai kouzoutai = 0xfedcba9876543210ul; のような書き方ができます。String 型からの変換を受け付けるようにすれば、 ItumonoKozoutai kouzoutai = "1234,5678"; とも書けるようになるでしょう。
> str_s = "かきくけこ"; で値を入れた場合 > 強制的にnewをされるクラスというのは
オブジェクト初期化子、静的メソッド、引数付きコンストラクタ、あるいは explicit / implicit などといった演算子のオーバーロードで対応することはできます。
ただ、リテラル表記そのものについては言語仕様レベルの話になるので、 自分では自由に追加できません。なお、C# 6.0 (VS2015) においては、 System.IFormattable formatable = $"({x}, {y})"; のようなリテラルが追加されていますね。
|