繁体   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