Как добавить методы и поля к литеральным объектам? - PullRequest
0 голосов
/ 19 сентября 2018

В объектно-ориентированном программировании все должно быть объектом.Исходя из этого постула, возможно ли добавить методы и поля к литеральному объекту, такому как число, строка, логическое значение или символ?

Я заметил, что в C # мы можем использовать некоторые методыи поля класса "Integer" из математического выражения:

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

Я полагаю, что это более синтаксический сахар для доступа к классу "Integer" и методу, фактически связанному с математическим выражением (и / илиего значение).

Но возможно ли в C # определить один из методов и полей только для литерального объекта?Например, эти примеры:

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

Это, вероятно, было бы бесполезно, но, поскольку язык является объектно-ориентированным, это должно быть осуществимо.Если это невозможно в C #, как мы можем сделать это с объектно-ориентированной парадигмой?

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018
"Hello, world!".print();

Эта строка является экземпляром класса String в C #, который наследуется от класса Object.Поэтому вы должны создать метод print () в классе String, чтобы эта работа работала.

0 голосов
/ 19 сентября 2018

Для этого можно использовать методы расширения, которые должны быть статическими методами, определенными в статическом классе.В приведенном выше примере вы можете сделать следующее:

public static class Extensions
{
    public static int increment(this int num)
    {
        return ++num;
    }
}
0 голосов
/ 19 сентября 2018

Вы не добавляете методы к данному экземпляру объекта, вы добавляете методы к типу .Кроме того, язык не позволяет вам определять, какие методы есть у строкового (или другого типа) литерала, он определяет, какие методы имеют все строки, из которых строковые литералы действуют так же, как любые не-литеральные строкии имеют точно такие же методы.

Обратите внимание, что (2 + 2) не является экземпляром класса "Integer", он будет преобразован в экземпляр System.Int32 struct .Разница не имеет отношения к этому поведению, но она имеет отношение ко многим другим.

0 голосов
/ 19 сентября 2018

Конечно, вы можете реализовать метод расширения и иметь желаемый синтаксис (однако класс 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):

...