В несколько более понятном английском, чем другие (правильные) ответы: git checkout
не останавливает файлы, о которых он не знает. Поскольку вы еще не сделали git add
в файле file1.html и file2.html, git не знает о них и поэтому не удаляет их при изменении ветвей.
Если вы были add
и commit
их на ветке моей работы, они уйдут, когда вы проведете мастер, и вернитесь, когда вы посмотрите мои работы.
Это - пустой оператор объединения, и вполне как троичное (непосредственный - если) оператор. См. также ?? Оператор - MSDN.
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
расширяется до:
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
, который далее расширяется до:
if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
На английском языке, это означает, "Если то независимо от того, что налево, не является пустым, используйте это, иначе используйте то, что направо".
Примечание, что можно использовать любое количество их в последовательности. Следующее утверждение присвоит первый непустой указатель Answer#
Answer
(если все Ответы будут пустыми тогда эти Answer
, является пустым):
string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
<час> Также это стоит упомянуть, в то время как расширение выше концептуально эквивалентно, результат каждого выражения только оценен однажды. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Кредит к @Joey для указания на это.)
объединение оператора
это эквивалентно
FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
Для Вашего развлечения только (знающий Вас все парни C#;-).
я думаю, что это произошло в Smalltalk, где это было вокруг много лет. Это определяется там как:
в Объекте:
? anArgument
^ self
в UndefinedObject (иначе класс ноля):
? anArgument
^ anArgument
Там и оценивают (?) и не оценивают версии (??) из этого.
Это часто находится в методах получателя для лениво инициализированного, частного (экземпляр) переменные, которым оставляют ноль, пока действительно не необходимый.
??
там для обеспечения значения для nullable типа, когда значение является пустым. Так, если formsAuth будет пустым, он возвратит новый FormsAuthenticationWrapper ().
Это - стенография для тернарного оператора.
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
Или для тех, кто не делает троичный:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
Спасибо все, вот самое сжатое объяснение, которое я нашел на сайте MSDN:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
Это - пустой оператор объединения.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Да, почти невозможный искать, если Вы не знаете то, чем это называют!:-)
РЕДАКТИРОВАНИЕ: И это - замечательная функция от другого вопроса. Можно объединить их в цепочку.
Просто, потому что никто еще еще не сказал волшебные слова: это пустой оператор объединения. Это определяется в разделе 7.12 из спецификация языка .
C# 3.0, Это очень удобно, особенно из-за способа, которым это работает, когда это используется многократно в выражении. Выражение формы:
a ?? b ?? c ?? d
даст результат выражения a
, если это будет непустым, иначе попробуйте b
, иначе попробуйте c
, иначе попробуйте d
. Это закорачивает в каждой точке.
кроме того, если тип d
является не допускающим NULL-значения, тип целого выражения является не допускающим NULL-значения также.
Если вы знакомы с Ruby, мне кажется, что его || =
сродни C # ??
. Вот немного Ruby:
irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"
А в C #:
string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";