Как лучше всего определить, равен ли объект нулю (0) или string.empty в C#?
Обновлено: Объект может соответствовать любому встроенному типу System.Value или ссылочному типу.
Исходный код:
public void MyMethod(object input1, object input2)
{
bool result = false;
object compare = new object();
if (input != null && input2 != null)
{
if (input1 is IComparable && input2 is IComparable)
{
//do check for zero or string.empty
//if input1 equals to zero or string.empty
result = object.Equals(input2);
//if input1 not equals to zero or string.empty
result = object.Equals(input1) && object.Equals(input2); //yes not valid, but this is what I want to accomplish
}
}
}





Вы имеете в виду null или string.empty, если говорите о строках?
if (String.IsNullOrEmpty (obj as string)) {... сделать что-нибудь}
В первом случае проверяя, равно ли оно нулю. Во втором случае, проверив, является ли он string.empty (вы ответили на свой вопрос).
Я должен добавить, что объект никогда не может быть равен 0. Однако объектная переменная может иметь нулевую ссылку (на самом деле это означает, что переменная имеет значение 0; однако в этом случае нет объекта)
Я не забыл про бокс. Чтобы выполнить сравнение obj == 0, значение должно быть распаковано, поскольку сам объект не равен 0, значение, которое он помещает, содержит 0.
Майкл, вам нужно предоставить здесь немного больше информации.
строки можно сравнить с null или string.Empty с помощью метода
string x = "Some String"
if ( string.IsNullOrEmpty(string input) ) { ... }
int, decimals, double (и другие числовые типы значений) можно сравнить с 0 (нулем) с помощью простого теста ==
int x = 0;
if (x == 0) { ... }
Вы также можете иметь типы значений, допускающие значение NULL, с помощью оператора? при их создании. Это позволяет вам установить тип значения как null.
int? x = null;
if ( !x.HasValue ) { }
Для любого другого объекта простой == нулевой тест скажет вам, является ли он нулевым или нет.
object o = new object();
if ( o != null ) { ... }
Надеюсь, это проливает свет на вещи.
Не совсем уверен в причинах этого, потому что .Equals - это ссылочное равенство для ссылочных типов и равенство значений для типов значений.
Кажется, это работает, но я сомневаюсь, что это то, что вы хотите:
static bool IsZeroOrEmpty(object o1)
{
if (o1 == null)
return false;
if (o1.GetType().IsValueType)
{
return (o1 as System.ValueType).Equals(0);
}
else
{
if (o1.GetType() == typeof(String))
{
return o1.Equals(String.Empty);
}
return o1.Equals(0);
}
}
Когда я отлаживал, «return (o1 as System.ValueType) .Equals (0)» возвращал false, когда я передавал методу ноль ...
Мне нужно было бы преобразовать ноль «0» в тип o1, чтобы получить корректное сравнение. Например, я ввел 0, это «System.Decimal», а ноль в равных значениях считается «System.Int32»
obj => obj is int && (int)obj == 0 || obj is string && (string)obj == string.Empty
Что в этом плохого?
public static bool IsZeroOrEmptyString(object obj)
{
if (obj == null)
return false;
else if (obj.Equals(0) || obj.Equals(""))
return true;
else
return false;
}
это возвращает true, только если obj имеет тип Int32.
Используя образец кода Джонатана Холланда с небольшими изменениями, вот решение, которое сработало:
static bool IsZeroOrEmpty(object o1)
{
bool Passed = false;
object ZeroValue = 0;
if (o1 != null)
{
if (o1.GetType().IsValueType)
{
Passed = (o1 as System.ValueType).Equals(Convert.ChangeType(ZeroValue, o1.GetType()))
}
else
{
if (o1.GetType() == typeof(String))
{
Passed = o1.Equals(String.Empty);
}
}
}
return Passed;
}
Это не будет компилироваться, так как есть условие, при котором он не будет возвращаться.
У меня тоже работает: o1.Equals(Convert.ChangeType(0, o1.GetType())).
строка не является типом значения. это ссылочный тип.