4

私はEto guiフレームワークを使用しています。ソースコードに魔法の文法がいくつか見られました。例えば:

int x;
int? x;
void func(int param);
void func(int? param);

何が違うの?私は混乱しています。シンボル?はグーグルするのが難しいです。

4

2 に答える 2

8

これは、それらがNullable であり、null値を保持できることを意味します。

定義した場合:

int x;

それからあなたはできません:

x = null; // this will be an error. 

ただし、次のように定義xした場合:

int? x;

次に、次のことができます。

x = null; 

Nullable<T> Structure

C# と Visual Basic では、? を使用して値の型を null 許容としてマークします。値の型の後の表記。たとえば、int? C#または整数で?Visual Basic では、null を割り当てることができる整数値型を宣言します。

個人的には、http://www.SymbolHound.comを使用してシンボルを検索します。ここで結果を見てください。

?は単なる構文糖衣であり、次と同等です。

int? xと同じですNullable<int> x

于 2013-02-26T05:45:57.937 に答える
5

structs ( intlongなど) はnullデフォルトでは受け入れられません。そのため、.NET は、 type-param を他の任意の s から取得できる汎用的なstruct名前Nullable<T>を提供します。Tstruct

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 

たとえば、という名前のメソッドでTableHTML<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>
于 2013-02-26T05:57:50.240 に答える