Почему я не могу получить от долгого?
-
21-09-2019 - |
Вопрос
Моя функция возвращает некоторое длинное значение, которое содержит два значения в более низких и более высоких 32 битах.
Я подумал, что лучшие способы обработки возврата - это получить свой пользовательский тип от Long и предоставить такие расширители типов, как GetLowerValue (), gethighervalue ().
Проблема в том, что .NET не позволяет выходить из длинных
Если вы скомпилируете это
public class SubmitOrderResult : long
{
}
Вы получаете:
cannot derive from sealed type 'long'
Почему это спроектировано, и как это может преодолеть?
Спасибо
Решение
Как уже упомянутые типы значений в .NET запечатаны, поэтому вы не можете получить от долгого времени. Вы должны создавать методы расширения в соответствии с предложением.
Пример
public static class LongExtensions
{
public static long GetLowerValue(this long value)
{
...
}
public static long GetHigherValue(this long value)
{
...
}
}
Другие советы
Вы не можете получить из любого из типов значений .NET - все они запечатаны по определению.
Возможно, вы могли бы реализовать свои методы GetLowerValue и Gethighervalue в качестве методов расширения?
Моя функция возвращает некоторое длинное значение, которое содержит два значения в более низких и более высоких 32 битах.
Это звучит как действительно, действительно грязный хак. Это может быть подходящим для ближайших к металлическим языкам (например, C), но не для более высокого уровня, ориентированного на объект.
На языках OO вы расширяете систему типов, а не преследуют существующие типы, чтобы выполнять ваши приказы. Таким образом, решение должно состоять в том, чтобы создать новый тип, который несет вашу информацию.
То, что вы можете сделать, это написать структуру с неявным операторами конверсии. Это будет работать точно так, как вы хотите:
public struct SubmitOrderResult
{
private long _result;
public SubmitOrderResult(long result)
{
_result = result;
}
public long Result
{
get { return _result; }
set { _result = value; }
}
public int GetHigherValue()
{
return (int)(_result >> 32);
}
public int GetLowerValue()
{
return (int)_result;
}
public static implicit operator SubmitOrderResult(long result)
{
return new SubmitOrderResult(result);
}
public static implicit operator long(SubmitOrderResult result)
{
return result._result;
}
}
Тогда вы можете сделать:
SubmitOrderResult result = someObject.TheMethod();
Console.WriteLine(result.GetHigherValue());
Console.WriteLine(result.GetLowerValue());
... так же, как вы хотели.
Если я правильно понимаю, ваша функция фактически возвращает два значения и тот факт, что вы упаковываете их в long
это деталь реализации. В этом случае скрыть эту деталь и создайте класс, который содержит значение и требуемые операции:
public class SubmitOrderResult
{
private readonly long value_;
public int OneValue
{
get { return (int)(value_ >> 32); }
}
public int TheOtherValue
{
get { return (int)(value_ & 0xFFFFFFFF); }
}
public SubmitOrderResult(long value)
{ value_ = value; }
}
Вы не можете преодолеть это.
В качестве long
это герметичный тип, и поэтому вы не можете унаследовать от них. Увидеть MSDN
Поскольку структуры косвенно запечатаны, они не могут быть унаследованы.
Для получения дополнительной информации см. Наследование (Руководство по программированию C#).