- Код: Выделить всё
Module All
Sub Main()
Console.WriteLine(Object.ReferenceEquals("", New String("a"c, 0)))
Console.ReadKey()
End Sub
End Module
PS: Вопрос скорее из любопытства.
Module All
Sub Main()
Console.WriteLine(Object.ReferenceEquals("", New String("a"c, 0)))
Console.ReadKey()
End Sub
End Module
Dim X As Integer = 0
Console.WriteLine(Object.ReferenceEquals(X, X))
FireFenix писал(а):Я наверное слижком глуп, но зачем в конструкторе подменять объект?
FireFenix писал(а):И какой результат вы ожидали от выше приведённого модуля и Object.ReferenceEquals?
Qwertiy писал(а):С value-типами всегда false. Даже так:
- Код: Выделить всё
Dim X As Integer = 0
Console.WriteLine(Object.ReferenceEquals(X, X))
MSDN писал(а):Однако обратите внимание, что если objA и objB являются типами значений, они упакованы до того, как они передаются методу ReferenceEquals
Qwertiy писал(а):
- Код: Выделить всё
Console.WriteLine(Object.ReferenceEquals("", New String("a"c, 0)))
Console.WriteLine(Object.ReferenceEquals(new string('a',0), new string('b',0))); TRUE
Console.WriteLine(Object.ReferenceEquals(new string('a',1), new string('b',1))); FALSE
Dmitriy2003 писал(а):и это правильно....чего-то другого ожидать?
Dmitriy2003 писал(а):и это правильно
- Код: Выделить всё
Console.WriteLine(Object.ReferenceEquals(new string('a',0), new string('b',0))); TRUE
Console.WriteLine(Object.ReferenceEquals(new string('a',1), new string('b',1))); FALSE
Dmitriy2003 писал(а):MSDN писал(а):
Qwertiy писал(а):Я уже написал чего. Ты понимаешь что такое ReferenceEquals?
Qwertiy писал(а):Console.WriteLine(Object.ReferenceEquals(new string('a',1), new string('a',1))); // False - вот это правильно!
Dmitriy2003 писал(а):ну да и тут два разных обьекта и они не равны NULL
Qwertiy писал(а):Dmitriy2003 писал(а):ну да и тут два разных обьекта и они не равны NULL
Какой ещё null? Пустая строка ему не равна. Проверь, если не веришь.
MSDN писал(а):Object.ReferenceEquals Method
Return Value: true if objA is the same instance as objB or if both are null references; otherwise, false.
String - конструктор (Char, Int32)
Заметки: Если значение параметра count равно нулю, инициализируется экземпляр Empty.
Empty: Представляет пустую строку. Это поле доступно только для чтения.
Dmitriy2003 писал(а):MSDN писал(а):Заметки: Если значение параметра count равно нулю, инициализируется экземпляр Empty.
Qwertiy писал(а):Это был ответ ark'у на пример с Date
Qwertiy писал(а):New возвращает уже существующий объект, пустую строку, на которую и ссылается String.Empty
ark писал(а):Вот и я сперва предположил, что если создаваемый объект совпадает с какой-то из имеющихся констант (String.Empty, Date.MinValue и т.п.), то конструктор возвращает именно эту константу. Однако в случае с Date это не так.
Dmitriy2003 писал(а):MSDN писал(а):Заметки: Если значение параметра count равно нулю, инициализируется экземпляр Empty.
GetType(String).GetField("Empty", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Static).SetValue(Nothing, "It was an empty string")
Console.WriteLine(New String("a"c, 0))
Console.WriteLine(New Text.StringBuilder())
Хорошо, так устроит?New Date?(Nothing)Qwertiy писал(а):Во-первых, Date - это value-тип
Не в терминологии дело. Ну, пусть будут "заранее инициализированные ReadOnly свойства" - что это меняет.Qwertiy писал(а): Во-вторых, String.Empty - это не константа, как и Date.MinValue
ark писал(а):Хорошо, так устроит? New Date?(Nothing)
ark писал(а):Не в терминологии дело. Ну, пусть будут "заранее инициализированные ReadOnly свойства" - что это меняет.
И какой же value у Nothing?Qwertiy писал(а):Date? - тоже value
ark писал(а):И какой же value у Nothing?Qwertiy писал(а):Date? - тоже value
Date? - Nullable тип, с помощью которого value превращается в элегантныешортыreference
? GetType(Integer?).IsByRef
False
? GetType(Integer?).IsClass
False
? GetType(Integer?).IsMarshalByRef
False
? GetType(Integer?).IsValueType
True
Qwertiy писал(а):Вот именно, String.Empty, а не ""...
Dmitriy2003 писал(а):The static member is always accessed by the class name, not the instance name. Only one copy of a static member exists, regardless of how many instances of the class are created.
Каюсь, ошибался. Мне казалось, Nullable логичнее сделать классом, а не структурой.Qwertiy писал(а):Ага, конечно Проверь. И посмотри его декларацию.
Мне сдаётся, к тому, что String.Empty всегда имеет один и тот же референс. Кстати:Qwertiy писал(а):Это вообще к чему?
GetType(String).GetField("Empty", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Static).SetValue(Nothing, "It was an empty string")
Console.WriteLine(Object.ReferenceEquals("", New String("a"c, 0)))
Console.WriteLine(Object.ReferenceEquals(String.Empty, New String("a"c, 0)))
ark писал(а):Мне казалось, Nullable логичнее сделать классом, а не структурой.
Public Sub Main()
Console.WriteLine(GetType(Nullable).IsClass) ' True
Console.WriteLine(GetType(Nullable(Of Integer)).IsClass) ' False
Console.ReadKey()
End Sub
ark писал(а):Мне сдаётся, к тому, что String.Empty всегда имеет один и тот же референс. Кстати:
Private Function UseEmpty(ByVal Str As String) As String
Return If(String.IsNullOrEmpty(Str), String.Empty, Str)
End Function
Private Function UseReallyEmpty(ByVal Str As String) As String
Return If(String.IsNullOrEmpty(Str), "", Str)
End Function
Public Sub Main()
Dim A As String = Nothing
Console.WriteLine("UseEmpty: {0}", UseEmpty(A))
Console.WriteLine("UseReallyEmpty: {0}", UseEmpty(A))
GetType(String).GetField("Empty").SetValue(Nothing, "It was an empty string")
Console.WriteLine("UseEmpty: {0}", UseEmpty(A))
Console.WriteLine("UseReallyEmpty: {0}", UseReallyEmpty(A))
Console.WriteLine(String.IsNullOrEmpty(String.Empty))
Console.WriteLine(String.IsNullOrEmpty(""))
Console.ReadKey()
End Sub
UseEmpty:
UseReallyEmpty:
It was an empty stringUseEmpty: It was an empty string
It was an empty stringUseReallyEmpty:
False
True
http://blogs.msdn.com/b/ericlippert/archive/2009/09/28/string-interning-and-string-empty.aspxQwertiy писал(а):Это как раз подтверждает, что конструктор возвращает значение String.Empty, а не константу "".
GetType(String).GetField("Empty", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Static).SetValue(Nothing, "It was an empty string")
Console.WriteLine(Object.ReferenceEquals("It was an empty string", String.Empty))
Console.WriteLine(Object.ReferenceEquals("It was an empty string", New String("a"c, 0)))
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 94