6

我的函数返回一些长值,其中包含低 32 位和高 32 位中的两个值。

我认为处理返回值的最佳方法是从 long 派生我的自定义类型并提供类型扩展器,如 GetLowerValue()、GetHigherValue()。

问题是 .NET 不允许从 long 派生

如果你编译那个

public class SubmitOrderResult : long
{
}

你得到:

cannot derive from sealed type 'long'

为什么要这样设计,如何克服它?

谢谢

4

6 回答 6

11

正如已经提到的 .NET 中的值类型是密封的,因此您无法从 long 派生。您应该按照建议创建扩展方法。

例子

public static class LongExtensions
{
    public static long GetLowerValue(this long value)
    {
        ...
    }

    public static long GetHigherValue(this long value)
    {
        ...
    }
}
于 2009-11-23T12:45:15.997 回答
6

您不能从任何 .NET 值类型派生 - 它们都是按定义密封的。

也许您可以将 GetLowerValue 和 GetHigherValue 方法实现为扩展方法?

于 2009-11-23T12:43:07.153 回答
5

我的函数返回一些长值,其中包含低 32 位和高 32 位中的两个值。

这听起来像是一个非常非常肮脏的黑客行为。它可能适用于接近金属的语言(例如 C),但不适用于更高级别的面向对象的语言。

在 OO 语言中,您扩展了类型系统,而不是骚扰现有类型来完成您的竞标。因此,解决方案应该是创建一个携带您的信息的新类型。

于 2009-11-23T12:51:13.513 回答
4

您可以做的是编写一个带有隐式转换运算符的结构。这将完全按照您想要的方式工作:

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());

......就像你想要的那样。

于 2009-11-23T12:55:00.707 回答
3

如果我理解正确,您的函数实际上返回两个值,并且您将它们打包到 a 中的事实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; }
}
于 2009-11-23T12:50:06.557 回答
1

你无法克服它。

Aslong是密封类型,因此您不能从它们继承。请参阅MSDN

因为结构是隐式密封的,所以它们不能被继承。

有关详细信息,请参阅继承(C# 编程指南)

于 2009-11-23T12:45:42.777 回答