簡體   English   中英

如何聲明一個帶有連字符的變量

[英]How do I declare a variable with hyphen in it

最近我在類中遇到了一個 json 對象名稱聲明,並且能夠通過以下方式解決它:

  [JsonProperty("flv-270p")]
        public string flv270p { get; set; }

那么如果我想在沒有 JsonProperty 的情況下聲明 flv-270p 我該怎么做呢?

喜歡 :

public string flv270-p { get; set; }

簡短的回答:你不能。

.NET 支持任意成員名稱,包括在 CIL 語言中非法的成員名稱。 但是,如果一種語言不支持它,那么您就不能使用它,這包括連字符和破折號。 出於這個原因,C# 中的自動屬性在其隱藏的支持字段名稱中使用<>

C# 確實允許您在關鍵字前加上@符號,以允許您將其用作變量或成員名稱(例如public int @classpublic void @struct(int @interface)但這是為了消費者的利益。

但是,在任何情況下,c# 都不允許您在名稱中使用連字符,因為該字符用於一元否定和二元減法運算符。 名稱flv270-p被解釋為“ flv270減去p ”。

你不能:

有效名稱定義為:

identifier:
    available-identifier
    @   identifier-or-keyword
available-identifier:
    An identifier-or-keyword that is not a keyword
identifier-or-keyword:
    identifier-start-character   identifier-part-charactersopt
identifier-start-character:
    letter-character
    _ (the underscore character U+005F) 
identifier-part-characters:
    identifier-part-character
    identifier-part-characters   identifier-part-character
identifier-part-character:
    letter-character
    decimal-digit-character
    connecting-character
    combining-character
    formatting-character
letter-character:
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
    A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl
combining-character:
    A Unicode character of classes Mn or Mc
    A unicode-escape-sequence representing a character of classes Mn or Mc
decimal-digit-character:
    A Unicode character of the class Nd
    A unicode-escape-sequence representing a character of the class Nd
connecting-character:
    A Unicode character of the class Pc
    A unicode-escape-sequence representing a character of the class Pc
formatting-character:
    A Unicode character of the class Cf
    A unicode-escape-sequence representing a character of the class Cf 

連字符減號屬於 Pd 類,因此在上面不允許使用。

這確實是為什么在名稱中允許 Pd 類的東西是一個壞主意的原因之一:

int x-y = 3;
int x = 10;
int y = 2;
int z = x-y; //3 or 8? Impossible to tell if the first line were allowed.

實際上你可以使用這樣的代碼

public string flv270_p { get; set; }

並返回一個用“_”替換“-”的重新格式化的類。

例如,如果你有這個,

var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>()
        {
            {"from", request.from},
            {"to", request.to},
            {"text", request.text}
        });

        return JsonConvert.DeserializeObject<SMSResponse>(jsonstring);

做這個,

var jsonstring = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(SMS), "/sms/json"), new Dictionary<string, string>()
        {
            {"from", request.from},
            {"to", request.to},
            {"text", request.text}
        }).Replace("-","_");

        return JsonConvert.DeserializeObject<SMSResponse>(jsonstring);

flv-270p不是 C# 中的有效變量名。 每當您在代碼中鍵入類似的內容時,編譯器都會認為您正在嘗試執行“flv270 minus p”:)

其他答案很好地解釋了為什么你不能做你所要求的。 話雖如此,我遇到過我希望我的對象元數據帶有連字符的情況,以便制定針對 SEO 優化的描述性 URL。 您在問題中使用的屬性方法有效,但您也可以使用約定來指示這種沒有屬性的自定義。 一個建議是預處理成員名稱以使用 PascalCase 並在單詞之間插入連字符分隔符。 這可能會導致過多的元數據更改。 另一種選擇是使用下划線“_”,它是 C# 名稱中的合法字符,並在預處理中用連字符替換下划線。 您的問題並沒有真正說明您的用例以說明如何在元數據上下文中實現/注入,但希望這些想法在您設計 api 時會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM