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"添加到字符串正文中?
在典型的字符串插入场景中,我会执行以下操作之一:
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 + @"***";