c# - 字符串插值中可避免的装箱

标签 c# .net string string-interpolation

使用字符串插值使我的字符串格式看起来更加清晰,但是如果我的数据是值类型,我必须添加 .ToString() 调用。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var person = new Person { Name = "Tom", Age = 10 };
var displayText = $"Name: {person.Name}, Age: {person.Age.ToString()}";

.ToString() 使格式变得更长更难看。我试图摆脱它,但 string.Format 是一个内置的静态方法,我无法注入(inject)它。你对此有什么想法吗?由于字符串插值是 string.Format 的语法糖,为什么他们在生成语法糖背后的代码时不添加 .ToString() 调用?我认为这是可行的。

最佳答案

我看不出如何避免编译器的装箱。 string.Format 的行为不是 C# 规范的一部分。您不能指望它会调用 Object.ToString()。事实上它没有:

using System;
public static class Test {
    public struct ValueType : IFormattable {
        public override string ToString() => "Object.ToString";
        public string ToString(string format, IFormatProvider formatProvider) => "IFormattable.ToString";
    }
    public static void Main() {
        ValueType vt = new ValueType();
        Console.WriteLine($"{vt}");
        Console.WriteLine($"{vt.ToString()}");
    }
}

关于c# - 字符串插值中可避免的装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35144363/

相关文章:

c# - 虚拟属性不会在 Entity Framework 6 中延迟加载(警告)

c# - LINQ(或其他东西)比较两个列表中的一对值(以任何顺序)?

c# - 执行 .bat 文件时 ExitCode 始终为 0

c# - OData 和自定义 WCF WebGet 方法

string - 删除 R 中除撇号和字内破折号之外的标点符号

C-Compiler 在将字符串分配给 char 数组时说 "Cannot convert char * to char"

.net - 为什么即使页面的 EnableSessionState ="False"ASP.NET 仍然访问状态服务器,但仅适用于 VB.NET 站点,而不适用于 C# 站点?

c# - 以编程方式在 wpf : auto rowheight doesn't seem to work 中填充网格

c# - 在 VS2008 中找不到 System.Web.Hosting

c - 指针和字符串的关系