C# 如何向文本对象添加方法和字段?

C# 如何向文本对象添加方法和字段?,c#,.net,oop,literals,C#,.net,Oop,Literals,在面向对象编程中,一切都应该是对象。从这个假设开始,是否可以向文本对象(如数字、字符串、布尔值或字符)添加方法和字段 我注意到,在C中,我们可以从数学表达式中使用Integer类的一些方法和字段: var a = (2 + 2).ToString(); 我认为,访问Integer类和与数学表达式和/或其值实际相关的方法更符合语法 但在C语言中,是否可以单独为一个文本对象定义一个方法和字段?例如: "Hello, world!".print(); var foo = 9.increment();

在面向对象编程中,一切都应该是对象。从这个假设开始,是否可以向文本对象(如数字、字符串、布尔值或字符)添加方法和字段

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

var a = (2 + 2).ToString();
我认为,访问Integer类和与数学表达式和/或其值实际相关的方法更符合语法

但在C语言中,是否可以单独为一个文本对象定义一个方法和字段?例如:

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

这可能是无用的,但由于语言是面向对象的,这应该是可行的。如果这在C语言中不可能实现,那么我们如何使用面向对象的范例来实现呢?

当然,您可以实现一个扩展方法并具有所需的语法,但是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扩展的所有内容中:

当然,您可以实现扩展方法并具有所需的语法,但是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扩展的所有内容中:

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

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

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

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

您不会将方法添加到对象的给定实例,而是将方法添加到类型。此外,该语言不允许您定义字符串或其他类型的文字有哪些方法,它定义了所有字符串都有哪些方法,哪些字符串文字的行为与任何非文字字符串一样,并且具有完全相同的方法


请注意,2+2不是Integer类的实例,它将解析为System.Int32结构的实例。这种差异与此行为无关,但与许多其他行为相关。

您不向对象的给定实例添加方法,而是向类型添加方法。此外,该语言不允许您定义字符串或其他类型的文字有哪些方法,它定义了所有字符串都有哪些方法,哪些字符串文字的行为与任何非文字字符串一样,并且具有完全相同的方法

"Hello, world!".print();
请注意,2+2不是Integer类的实例,它将解析为System.Int32结构的实例。这种差异与这种行为无关,但与许多其他行为相关

"Hello, world!".print();
此字符串是C中从对象类继承的字符串类的实例。因此,您必须在String类中创建print方法才能使其正常工作


此字符串是C中从对象类继承的字符串类的实例。因此,您必须在String类中创建print方法才能实现这一点。

FYI:C.NET中并非所有内容都是对象。NET具有可以从中创建对象实例的引用类型,以及不能从中创建对象实例的值类型。但是,值类型可以包装在对象中,例如,允许值类型作为类型对象的参数传递给方法这是自动处理的不确定您在这里要问什么-2是int,所以2+2也是int。您好,world!是一个字符串,就像下面代码中的s变量:string s=Hello,world@从-->System.Object…继承的elgonzo。。。。然而,引用本身既不是引用类型,也不是值类型——语言的结构(如循环、条件等)也是如此。因此,即使是出于错误的原因,您也是正确的:-@elgonzo您肯定可以拥有值类型的实例。事实上,值类型的每个变量都有一个实例。不可能。C中唯一不是对象的类型是指针,我想可能还有一种边缘类型。但基本上所有类型都是对象。好吧,我的第一条评论确实不正确。我会保留它,这样ZoharPeled和Servy的评论就不会断章取义了。很抱歉,我的错…仅供参考:C.NET中并非所有东西都是对象。NET具有可以从中创建对象实例的引用类型,以及不能从中创建对象实例的值类型。但是,值类型可以包装在对象中,例如,允许值类型作为类型对象的参数传递给方法这是自动处理的不确定您在这里要问什么-2是int,所以2+2也是int。您好,world!是一个字符串,就像下面代码中的s变量:string s=Hello,world@从-->System.Object…继承的elgonzo。。。。然而
引用本身既不是引用类型,也不是值类型——语言的结构(如循环、条件等)也是如此。因此,即使是出于错误的原因,您也是正确的:-@elgonzo您肯定可以拥有值类型的实例。事实上,值类型的每个变量都有一个实例。不可能。C中唯一不是对象的类型是指针,我想可能还有一种边缘类型。但基本上所有类型都是对象。好吧,我的第一条评论确实不正确。我会保留它,这样ZoharPeled和Servy的评论就不会断章取义了。很抱歉,我的错…很抱歉,但是我们不能:String和Int32都是密封的,这就是为什么它们不能像公共类MyString:String{public void print{…}那样被继承的原因。String和Int32都是标准库的类,我们不应该更改。是的,应该明确地提到这是不可能的。抱歉,但我们不能:String和Int32都是密封的,这就是为什么它们不能像公共类MyString那样被继承的原因:String{public void print{…}。String和Int32都是标准库的类,我们不应该更改。是的,应该明确提到这是不可能的。更准确地说,不是c语言定义了String,int,或者框架中构建的任何其他类型-它是框架类库。更准确地说,不是c语言定义string、int或框架中构建的任何其他类型的成员-它是框架类库。这将返回原始num,然后再将其增加1。在您的情况下,它应该是++num。这将返回原始num,然后再将其增加1。在您的情况下,它应该是++num。