有没有一种好方法可以在 C# 的方法中创建运行时常量?

问题描述 投票:0回答:1

我真的很喜欢在Java中,我们可以在方法中声明变量“final”,以表明它们在初始化后不会改变。在 C# 中,你不能做同样的事情——唯一的选项是 const(仅适用于基元)和 readonly(仅适用于在方法外部声明的字段),这两个选项都是我想要的。

我发现我可以做类似以下的事情来制作伪最终结构:

public readonly struct Final<T> {
    public readonly T Value;

    public Final(T val) {
        Value = val;
    }


    public static implicit operator T(Final<T> final) => final.Value;
    public static implicit operator Final<T>(T val) => new Final<T>(val);
}

这是我的问题:我希望能够使用这个 Final 结构并将其视为我所拥有的只是它存储的数据类型。例如,假设我有一个名为 Vector2 的存储 2D 向量的类,带有 x 和 y 参数。我希望能够写出这样的东西:

Final<Vector2> rightVec = new Vector2(3.0f, 0.0f);
int yComponent = rightVec.y

但是,我做不到以上的事情。相反,我必须写这样的东西:

Final<Vector2> rightVec = new Vector2(3.0f,0.0f);
int yComponent = rightVec.Value.y // <-- I don't want to have to write "Value"!

这让我想到了我的问题。首先,有没有办法做我想做的事?其次,有没有比结构更好的方法来完成我想要的事情?第三,尝试这样做是个好主意吗?

c# struct constants final readonly
1个回答
0
投票

比我更聪明的人可能会为您提供更好的选择,但除非我误解了这个问题,否则这似乎是

init
关键字的典型案例:

public readonly struct Vector
{
    public Vector()
    {
        x = 0;
        y = 0;
    }

    public Vector(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public double x { get; init; }
    public double y { get; init; }
}


Vector2 rightVec = new Vector2(3.0f, 0.0f);
int yComponent = (int)rightVec.y;

使用

init
而不是
set
的属性只能在其构造函数中或首次由调用者构造时更改,此后永远无法更改。

我认为这最接近您正在寻找的内容,但如果不是,请再次随时纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.