私はEto guiフレームワークを使用しています。ソースコードに魔法の文法がいくつか見られました。例えば:
int x;
int? x;
void func(int param);
void func(int? param);
何が違うの?私は混乱しています。シンボル?
はグーグルするのが難しいです。
私はEto guiフレームワークを使用しています。ソースコードに魔法の文法がいくつか見られました。例えば:
int x;
int? x;
void func(int param);
void func(int? param);
何が違うの?私は混乱しています。シンボル?
はグーグルするのが難しいです。
これは、それらがNullable であり、null値を保持できることを意味します。
定義した場合:
int x;
それからあなたはできません:
x = null; // this will be an error.
ただし、次のように定義x
した場合:
int? x;
次に、次のことができます。
x = null;
C# と Visual Basic では、? を使用して値の型を null 許容としてマークします。値の型の後の表記。たとえば、int? C#または整数で?Visual Basic では、null を割り当てることができる整数値型を宣言します。
個人的には、http://www.SymbolHound.comを使用してシンボルを検索します。ここで結果を見てください。
?
は単なる構文糖衣であり、次と同等です。
int? x
と同じですNullable<int> x
struct
s ( int
、long
など) はnull
デフォルトでは受け入れられません。そのため、.NET は、 type-param を他の任意の s から取得できる汎用的なstruct
名前Nullable<T>
を提供します。T
struct
public struct Nullable<T> where T : struct {}
現在のオブジェクトに値があるbool HasValue
かどうかを示すプロパティを提供します。Nullable<T>
およびT Value
現在の値の値を取得するプロパティNullable<T>
( の場合HasValue == true
、そうでない場合は をスローしますInvalidOperationException
):
public struct Nullable<T> where T : struct {
public bool HasValue {
get { /* true if has a value, otherwise false */ }
}
public T Value {
get {
if(!HasValue)
throw new InvalidOperationException();
return /* returns the value */
}
}
}
そして最後に、あなたの質問への答えとして、TypeName?
のショートカットですNullable<TypeName>
。
int? --> Nullable<int>
long? --> Nullable<long>
bool? --> Nullable<bool>
// and so on
そして使用中:
int a = null; // exception. structs -value types- cannot be null
int? a = null; // no problem
たとえば、という名前のメソッドでTable
HTML<table>
タグを生成するクラスがありますWrite
。見る:
public class Table {
private readonly int? _width;
public Table() {
_width = null;
// actually, we don't need to set _width to null
// but to learning purposes we did.
}
public Table(int width) {
_width = width;
}
public void Write(OurSampleHtmlWriter writer) {
writer.Write("<table");
// We have to check if our Nullable<T> variable has value, before using it:
if(_width.HasValue)
// if _width has value, we'll write it as a html attribute in table tag
writer.WriteFormat(" style=\"width: {0}px;\">");
else
// otherwise, we just close the table tag
writer.Write(">");
writer.Write("</table>");
}
}
上記のクラスの使用法 (例として) は、次のようなものです。
var output = new OurSampleHtmlWriter(); // this is NOT a real class, just an example
var table1 = new Table();
table1.Write(output);
var table2 = new Table(500);
table2.Write(output);
そして、次のようになります。
// output1: <table></table>
// output2: <table style="width: 500px;"></table>