Я вижу несколько принципиальных различий между резервными копиями и управлением версиями:
Однако единственное наиболее важное различие между резервными копиями и VCS - то, что в VCS изменения имеют значение . В резервном копировании сделана новая версия, потому что приблизительно , компьютер где-нибудь решил, что это было x
часы начиная с последнего резервного копирования; само изменение полностью бессмысленно . В VCS сделана новая версия, потому что приблизительно , человек решил, что эта версия имеет свое собственное значение , ее собственные идентификационные данные, отличающиеся от всех других версий. Так, в резервном копировании все версии равны (более точно: они одинаково бессмысленны), тогда как в VCS все версии специальны (у них есть свои собственные уникальные значения). В VCS изменения имеют фактическое история , где одно событие, ведомое к другому, в резервном копировании существует только строка несвязанных событий.
Тесно связанный с этим, понятие метаданные изменения . В VCS каждое изменение имеет автор , метка времени и, самое главное, сообщение о фиксации . Это сообщение о фиксации записывает , почему изменение было внесено, другими словами, оно записывает "значение", что я записал о в предыдущем абзаце.
история фиксации и особенно эти сообщения о фиксации являются самыми важными данными в репозитории VCS, не самим фактическим кодом! Эти метаданные абсолютно отсутствуют в резервном копировании.
Как показано в других ответах, это не может быть сделано непосредственно. Но что при необходимости в нем скажите, что Вы хотите к [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 относительно неявного преобразования).