c# 如何将变量插入字符串

本文关键字:插入 字符串 变量 | 更新日期: 2023-09-27 17:56:35

我想知道在 C# 中将变量插入字符串的不同方法。

目前正在尝试将值插入到我正在构建的 json 字符串中:

 Random rnd = new Random();
  int ID = rnd.Next(1, 999);
  string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""help here""}";

如何将"ID"添加到字符串正文中?

c# 如何将变量插入字符串

在典型的字符串插入场景中,我会执行以下操作之一:

string body = string.Format("My ID is {0}", ID);
string body = "My ID is " + ID;

但是,您的字符串显然是 JSON 序列化数据。我希望我想将其解析为一个类以便使用它。

var myObj = JsonConvert.DeserializeObject<MyClass>(someString);
myObj.TID = ID;
// maybe do other things with it, then if I need JSON again...
string body = JsonConvert.SerializeObject(myObj);

采用这种方法的一个原因是确保我输入的任何数据仍然使 JSON 有效。例如,如果我的 ID 不是int,而是包含需要转义的字符的string,则直接插入"'"'n'""将不是正确的做法。

字符串插值是当今最简单的方法:

int myIntValue = 123;
string myStringValue = "one two three";
string interpolatedString = $"my int is: {myIntValue}. My string is: {myStringValue}.";

输出将是"我的 int 是:123。我的字符串是:一二三。

您可以在此处自行试验此示例。

$ 特殊字符将字符串文本标识为内插 字符串。内插字符串是可能包含 插值表达式。当内插字符串解析为 结果字符串,带有内插表达式的项目将替换为 表达式结果的字符串表示形式。此功能从 C# 6 开始可用。

你可以试试这个:

string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID + @"""}";

您还可以使用string.Concat

string body = string.Concat(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""", ID, @"""}");
有许多

方法可以将值注入字符串,但是很容易忽略编码,并导致重大损坏。

如果只想将值注入到另一个字符串中,可以使用:

  • 字符串串联
  • 字符串构建
  • 字符串格式

串联:

构建字符串的最简单和最常见的方法是简单地将它们与+运算符连接在一起:

var foo = 5;
var bar = "example-" + foo;

串联可能难以阅读,这使得引入错误变得容易,但对于大多数简单的任务来说,这是适合这项工作的工具。

在这种情况下,这是一个糟糕的选择:

string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID.ToString() + @"""}";

字符串构建

StringBuilder 类对于构建大型字符串非常有用,尤其是在迭代构建时。

var sb = new StringBuilder();
for (var i = 0; i < 1000; i++) {
    sb.Append(i.ToString());
    sb.Append(" ");
}
var output = sb.ToString();

仍然难以阅读和调试,但对于将大量字符串连接在一起的情况,它非常高效

在这种情况下,这是一个糟糕的选择:

StringBuilder sb = new StringBuilder();
sb.Append(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""");
sb.Append(ID.ToString());
sb.Append(@"""}");
string body = sb.ToString();

字符串格式

string.Format方法使将数据模板化为字符串变得超级简单和高效。如果您计划一遍又一遍地重用相同的字符串,使用格式字符串可以更轻松地阅读和调试代码,尤其是在有大量替换时:

var foo = 5;
var bar = string.Format("example-{0}", foo);
格式

字符串还可以自动将文化上准确的格式应用于特定数据类型,以便正确显示DateTime,或者使数字具有适当数量的尾随零。

在这种情况下,这是一个糟糕的选择:

string string.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID);

正确的选择

您不会将数据转储到任何旧字符串中。这是 JSON 编码的数据。如果您只是连接/构建/格式化任何旧值,则可以断开字符串。例如,如果ID变量包含"字符,则会破坏整个 JSON 数据集。

此外,字符串的长度和必要的引号使其非常难以阅读,这使得难以维护。当您需要添加另一个格式化值时,祝您好运,更改任何现有值或添加新的动态值将很痛苦。

不要编写 JSON 文字,而是编写一个对象并将其编码为 JSON:

var bodyData =
    new
        {
            currency = "country",
            gold = 1,
            detail = "detailid-979095986",
            tId = ID //here's where you set the ID
        };
var jss = new JavaScriptSerializer();
var body = jss.Serialize(bodyData);

当数据更改时,此代码更容易修改,并且实际上会正确编码数据。您也无需再担心所有这些烦人的双引号字符。

您可以使用

String.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID)

由于这是 params object[] ,您可以根据需要使用任意数量的{n}

您可以使用

+ 将字符串连接在一起,而不是在字符串上使用,这将允许您在生成的字符串之间插入文本。

string body = @"***" + ID + @"***";