Вопрос

Моя функция возвращает некоторое длинное значение, которое содержит два значения в более низких и более высоких 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#).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top