Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类属性的ToString()?_C# - Fatal编程技术网

C# 类属性的ToString()?

C# 类属性的ToString()?,c#,C#,假设我有一个类“Item”,它有三个成员变量:string name、decimal quantity和string unit。我在这三个上都有公共get/set属性 有时,我想将数量显示为文本以及正确的单位,例如10米或100英尺 我的问题是,是否也可以为属性使用某种ToString()函数,以便可以自定义它们的文本输出 谢谢 索拉布。您有两个选择: 让父类的ToString()自动将这些片段附加到一个好的格式中 将属性包装到类中,并为这些类提供ToString() 您可以做的是使新的(只读)

假设我有一个类“Item”,它有三个成员变量:string name、decimal quantity和string unit。我在这三个上都有公共get/set属性

有时,我想将数量显示为文本以及正确的单位,例如10米或100英尺

我的问题是,是否也可以为属性使用某种ToString()函数,以便可以自定义它们的文本输出

谢谢

索拉布。

您有两个选择:

  • 让父类的ToString()自动将这些片段附加到一个好的格式中
  • 将属性包装到类中,并为这些类提供ToString()

  • 您可以做的是使新的(只读)属性返回格式化版本:

    public string QuantityAsString
    {
        get
        {
            return string.Format("{0} {1}", this.Quantity, this.Unit);
        }
    }
    

    一般来说,
    类不负责将值格式化为适当的单位。相反,这应该由一些外部类来完成


    但是,如果确实希望在类内进行格式化,我建议定义一个
    Unit
    类,将其转换为
    decimal
    int
    s以及所有所需的格式逻辑。

    我认为从代码质量的角度来看,最好的方法是创建一个用Unit包装值的类,并提供
    .ToString()
    在那里。

    听起来你的对象模型没有被正确分解。您可能要做的是将
    单位
    数量
    抽象到另一个对象中,然后您可以为此重写
    到字符串
    。这样做的好处是将相关值保持在一起,并允许您在将来实现单位之间的转换(例如,从英寸转换为英尺等),例如


    注意,我在这里创建了
    Measure
    结构,因为它可能具有值语义。如果采用这种方法,则应使其不可变,并根据结构的需要重写Equals/GetHashCode。

    您可以实现IFormatable接口以具有不同的ToString

    public class Item : IFormattable
    {
        public string Name;
        public decimal Quantity;
        public string Unit;
    
        public override string ToString(string format, IFormatProvider provider)
        {
            switch(format)
            {
                case "quantity": return Quantity + Unit;
                default: return Name;
            }
        }
    }
    
    可以这样使用:

    Item item = new Item();
    Console.WriteLine(item.ToString());
    Console.WriteLine("Quantity: {0:quantity}", item);
    

    几天前,我实现了相同的模型。我对数量和单位做了单独的分类。看起来是这样的(它被简化了,实际上有构造函数和重载运算符):


    我同意。格式化是表示层的问题,不应该封装在域层实体类中。不一定。如果对象可以用它的单位做一些有意义的事情,比如在它们之间转换等等,那么它就应该在对象本身中。还有谁说有一个用户界面?@Greg为什么他想“以文本的形式显示数量”@Anton-除了用户界面,还有其他地方可以显示东西。跟踪输出、事件日志等。如果希望任何对象的文本描述的格式和顺序在UI层之间保持一致,那么将格式逻辑放在域层就完全可以了。哇,有这么多解决方案!选择一个答案变得非常困难,因为在国际海事组织看来,许多建议的解决方案似乎是正确和有用的。两点:一,。现在有一个用户界面。但是,我仍然希望在对象内部进行“格式化”,因为它似乎是该对象固有的,在不参与某些计算时,返回其数量和单位。2.现在,我将使用Fredrik的解决方案,因为它为我提供了一个新的即用属性,而不需要为quantity+unit添加新对象的“麻烦”。@virtualmic-这可能是最简单的解决方案,但我认为它不是正确的解决方案。在某个时候,你必须支付混合关注点的可维护性税。谢谢Greg,谢谢你的关注。正如你和安东所建议的那样,我肯定也会尝试其他方法。再次感谢大家!
    Item item = new Item();
    Console.WriteLine(item.ToString());
    Console.WriteLine("Quantity: {0:quantity}", item);
    
    class Quantity
    {
        public decimal Value;
        public UnitOfMeasure Unit;
    
        public override string ToString() 
        {
            return string.Format("{0} {1}", Value, Unit); 
        }
    }
    
    class UnitOfMeasure
    {
        public string Name;
    
        public override string ToString() { return Name; }
    }