Можно ли определить метод оператора расширения?

Я вижу несколько принципиальных различий между резервными копиями и управлением версиями:

  1. Резервные копии только хранят последнюю версию, или, даже если они хранят несколько версий, они не хранят каждый версия. VCS делает , хранят каждую версию,
  2. , Что резервная версия часто устарела, потому что резервные копии не записывают каждое изменение, в то время как VCSs делают,
  3. , VCSs позволяют преследовать несколько альтернативных версий того же изменения одновременно (т.е. переходящий).

Однако единственное наиболее важное различие между резервными копиями и VCS - то, что в VCS изменения имеют значение . В резервном копировании сделана новая версия, потому что приблизительно , компьютер где-нибудь решил, что это было x часы начиная с последнего резервного копирования; само изменение полностью бессмысленно . В VCS сделана новая версия, потому что приблизительно , человек решил, что эта версия имеет свое собственное значение , ее собственные идентификационные данные, отличающиеся от всех других версий. Так, в резервном копировании все версии равны (более точно: они одинаково бессмысленны), тогда как в VCS все версии специальны (у них есть свои собственные уникальные значения). В VCS изменения имеют фактическое история , где одно событие, ведомое к другому, в резервном копировании существует только строка несвязанных событий.

Тесно связанный с этим, понятие метаданные изменения . В VCS каждое изменение имеет автор , метка времени и, самое главное, сообщение о фиксации . Это сообщение о фиксации записывает , почему изменение было внесено, другими словами, оно записывает "значение", что я записал о в предыдущем абзаце.

история фиксации и особенно эти сообщения о фиксации являются самыми важными данными в репозитории VCS, не самим фактическим кодом! Эти метаданные абсолютно отсутствуют в резервном копировании.

13
задан Matt 2 October 2019 в 11:40
поделиться

1 ответ

Как показано в других ответах, это не может быть сделано непосредственно. Но что при необходимости в нем скажите, что Вы хотите к [1 111], улучшают StringBuilder как

void Main()
{
    var log = (StringBuilder)"Hello ";
    log += "World!";
    log += "\nThis example shows how to extend StringBuilder";
    log.ToString().Dump();
}

, как можно достигнуть этого (т.е. использование + оператор вместо sb.Append(str);)?

<час>

Ответ: В этом случае, Вы не можете сделать этого непосредственно, но что можно сделать:

Выполнение это в Примечании DotNetFiddle

void Main()
{
    var log = (StrBuilder)"Hello "; // same as: "Hello ".ToStrBuilder();
    log += "World!";
    log += "\nThis example shows how to extend StringBuilder";
    log.ToString().Dump();
}

public static class Extensions
{
    public static StrBuilder ToStrBuilder(this string str)
    {
        return new StrBuilder(str);
    }   
}

public class StrBuilder
{
    private StringBuilder sb;

    public StrBuilder()
    {
        sb = new StringBuilder();
    }

    public StrBuilder(string strB)
    {
        sb = new StringBuilder(strB);
    }

    public static implicit operator StrBuilder(string self)
    {
        return new StrBuilder(self);
    }

    public static StrBuilder operator +(StrBuilder sbA, string strB)
    {       
        return sbA.Append(strB);
    }

    public StrBuilder Append(string strB)
    {
        sb.Append(strB);
        return this;
    }

    public override string ToString()
    {
        return sb.ToString();
    }
}

: Вы не можете наследоваться StringBuilder, потому что это - запечатанный класс, но можно ли записать класс, что "поля" StringBuilder - который является, что сделано здесь (благодаря ответ IanNorton относительно неявного преобразования).

0
ответ дан 1 December 2019 в 20:23
поделиться