如何将方法和字段添加到文字对象?

时间:2018-09-19 20:01:15

标签: c# .net oop literals

在面向对象的编程中,所有东西都应该是一个对象。从这个前提开始,是否可以将方法和字段添加到文字对象中,例如数字,字符串,布尔值或字符?

我注意到在C#中,我们可以从数学表达式中使用“ Integer”类的一些方法和字段:

var a = (2 + 2).ToString();

我想访问“ Integer”类和实际上与数学表达式(和/或其值)有关的方法是语法上的糖。

但是在C#中是否可以仅对文字对象定义方法和字段之一?例如以下示例:

"Hello, world!".print();
var foo = 9.increment();

这可能是没有用的,但是语言是面向对象的,这应该是可行的。如果在C#中无法做到这一点,那么我们如何使用面向对象的范例呢?

4 个答案:

答案 0 :(得分:4)

当然,您可以实现扩展方法并具有所需的语法(但是,Int32类将不会被更改):

  public static class IntExtensions {
    public static int increment(this int value) {
      return value + 1; 
    }
  }

 ...

 // Syntax sugar: the actual call is "int foo = IntExtensions.increment(9);"
 var foo = 9.increment();

在当前的C#版本(7.2)中,我们无法添加扩展属性扩展事件等。这些选项可以显示在 C#8.0 中>(扩展所有内容,https://msdn.microsoft.com/en-us/magazine/mt829270.aspx):

答案 1 :(得分:1)

您没有将方法添加到给定的对象实例中,而是将方法添加到了 type 中。此外,该语言不允许您定义字符串(或其他类型)文字具有的方法,它定义了 all 字符串具有的方法,这些字符串与所有非文字的方法一样字符串,并具有完全相同的方法。

请注意,(2 + 2)不是“ Integer”类的实例,它将解析为System.Int32 struct 的实例。差异与这种行为无关,但与许多其他行为有关。

答案 2 :(得分:0)

您可以使用扩展方法来实现此目的,扩展方法必须是在静态类中定义的静态方法。在上面的示例中,您可以执行以下操作:

public static class Extensions
{
    public static int increment(this int num)
    {
        return ++num;
    }
}

答案 3 :(得分:0)

"Hello, world!".print();

此字符串是C#中String类的一个实例,该实例继承自Object类。因此,您必须在String类中创建print()方法,才能使其正常工作。