如何使用连字符声明变量

时间:2012-08-31 13:21:18

标签: c# .net

最近我在课堂上面对json对象名称声明,并且能够通过以下方式解决它:

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

所以如果我想在不使用JsonProperty的情况下声明flv-270p,我该怎么做?

喜欢:

public string flv270-p { get; set; }

5 个答案:

答案 0 :(得分:6)

你不能:

有效名称定义为:

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 

Hyphen-minus属于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.

答案 1 :(得分:5)

简短回答:你不能。

.NET支持任意成员名称,包括那些在CIL语言中非法的成员名称。但是,如果某种语言不支持它,那么您就无法使用它,这包括连字符和破折号。因此,C#中的自动属性在其隐藏的支持字段名称中使用<>

C#允许您使用@符号作为前缀,以允许您将其用作变量或成员名称(例如public int @classpublic void @struct(int @interface),但这是为了消费者的利益

但是,在任何情况下,c#都不允许在名称中使用连字符,因为该字符用于一元否定和二元减法子运算符。名称flv270-p被解释为“flv270减去p”。

答案 2 :(得分:3)

实际上你可以使用像这样的代码

public string flv270_p { get; set; }

并返回重新格式化的类,替换&#34; - &#34;用&#34; _&#34;。

例如, 如果你有这个,

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);

答案 3 :(得分:1)

flv-270p不是C#中的有效变量名。每当你在代码中输入类似的东西时,编译器都认为你试图做“flv270减去p”:)

答案 4 :(得分:1)

其他答案给出了一个很好的解释,说明为什么你不能做exac你要求的。话虽这么说,我遇到了一些情况,我希望我的对象元数据有连字符,以便制定针对SEO优化的描述性URL。您在问题中使用的属性方法有效,但您也可以使用约定来指示这种没有属性的自定义。一个建议是预处理成员名称以使用PascalCase并在单词之间插入连字符分隔符。这可能会导致过多的元数据更改。另一种选择是使用下划线'_',它是C#名称中的合法字符,并在预处理中用连字符替换下划线。您的问题并没有真正说明您的用例,以说明如何在元数据上下文中实现/注入,但希望这些想法在您设计api时很有用。