如何向文字对象添加方法和字段?
How to add methods and fields to literal objects?
在面向对象编程中,一切都应该是一个对象。从这个postula开始,是否可以给文字对象添加方法和字段,比如数字、字符串、布尔值或字符?
我注意到在 C# 中,我们可以从数学表达式中使用 "Integer" class 的一些方法和字段:
var a = (2 + 2).ToString();
我认为访问 "Integer" class 和与数学表达式(和/或其值)实际相关的方法是更多的语法糖。
但是在C#中是否可以将其中一个方法和字段定义为单独的文字对象?比如这些例子:
"Hello, world!".print();
var foo = 9.increment();
这可能没什么用,但是面向对象的语言,这应该是可行的。如果这在 C# 中是不可能的,我们如何使用面向对象的范式来做到这一点?
当然,您可以实施 扩展方法 并具有 所需的语法 (但是,Int32
class 不会改变):
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):
您可以使用扩展方法来实现这一点,扩展方法必须是静态class中定义的静态方法。在上面的示例中,您可以执行以下操作:
public static class Extensions
{
public static int increment(this int num)
{
return ++num;
}
}
您不向对象的给定实例添加方法,而是向 类型 添加方法。此外,该语言不允许您定义字符串(或其他类型的)文字具有哪些方法,它定义 all 字符串具有哪些方法,其中字符串文字的行为与任何非文字字符串,并且具有完全相同的方法。
请注意 (2 + 2)
不是 "Integer" class 的实例,它将解析为 System.Int32
struct[= 的实例19=]。区别与此行为无关,但与许多其他行为有关。
"Hello, world!".print();
此字符串是 C# 中继承自对象 class 的字符串 Class 的一个实例。因此,您必须在 String Class 中创建 print() 方法才能完成这项工作。
在面向对象编程中,一切都应该是一个对象。从这个postula开始,是否可以给文字对象添加方法和字段,比如数字、字符串、布尔值或字符?
我注意到在 C# 中,我们可以从数学表达式中使用 "Integer" class 的一些方法和字段:
var a = (2 + 2).ToString();
我认为访问 "Integer" class 和与数学表达式(和/或其值)实际相关的方法是更多的语法糖。
但是在C#中是否可以将其中一个方法和字段定义为单独的文字对象?比如这些例子:
"Hello, world!".print();
var foo = 9.increment();
这可能没什么用,但是面向对象的语言,这应该是可行的。如果这在 C# 中是不可能的,我们如何使用面向对象的范式来做到这一点?
当然,您可以实施 扩展方法 并具有 所需的语法 (但是,Int32
class 不会改变):
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):
您可以使用扩展方法来实现这一点,扩展方法必须是静态class中定义的静态方法。在上面的示例中,您可以执行以下操作:
public static class Extensions
{
public static int increment(this int num)
{
return ++num;
}
}
您不向对象的给定实例添加方法,而是向 类型 添加方法。此外,该语言不允许您定义字符串(或其他类型的)文字具有哪些方法,它定义 all 字符串具有哪些方法,其中字符串文字的行为与任何非文字字符串,并且具有完全相同的方法。
请注意 (2 + 2)
不是 "Integer" class 的实例,它将解析为 System.Int32
struct[= 的实例19=]。区别与此行为无关,但与许多其他行为有关。
"Hello, world!".print();
此字符串是 C# 中继承自对象 class 的字符串 Class 的一个实例。因此,您必须在 String Class 中创建 print() 方法才能完成这项工作。