C#通用函数

Luk*_*ner 5 c# generics math unity-game-engine

在C#泛型上寻求帮助.我在Unity3D工作,并且正在滚动BiLerp函数,因为Unity3D没有.

public Vector3 BiLerp(Vector2 _uv, Vector3 _00, Vector3 _01, Vector3 _10, Vector3 _11)
{
    return _00 * (1 - _uv.x) * (1 - _uv.y) +
           _10 * _uv.x * (1 - _uv.y) +
           _01 * _uv.y * (1 - _uv.x) +
           _11 * _uv.x * _uv.y;
}
Run Code Online (Sandbox Code Playgroud)

但是,我想让这个功能更加强大.

  1. 我想使它通用,以便它采用任何可以乘以浮点数的类型
  2. 我不确定我是否应该使这个静止.我假设因为它不使用任何成员变量然后是.如果存储的类也是静态的,那么该类将仅用于由unity(Matrix2x2)等省略的数学助手.
  3. 在这种情况下,C#const如何工作?
  4. 在C++中,我将通过引用传递参数.我认为C#已经在做这个了吗?并且ref关键字是其他一些黑魔法工具?

如果还有其他建议,请随意.我现在只在C#工作了6个星期,可以使用任何建议.

Mat*_*son 6

  1. 虽然通过传入一个执行乘法的委托来实现这项工作是可能的,但它会慢得多.我实际上认为你最好不要写多个重载.

  2. 是的你应该,你也应该把它放到静态类中.(恕我直言!)我打算建议你把它作为一个扩展方法,但是在反射时它有太多的参数使它变得有用.

  3. C#consts类似于C++ consts,但普遍的共识是它们应该只是私有的(或者可能是内部的).

  4. 实际上,Vector2和Vector3是结构,因此它们按值传递.如果您想通过引用传递它们,请使用ref关键字:

    public Vector3 BiLerp(
        ref Vector2 _uv, ref Vector3 _00, ref Vector3 _01,
        ref Vector3 _10, ref Vector3 _11)`
    
    Run Code Online (Sandbox Code Playgroud)

但是,这样做只有两个原因(对于结构):

  1. 因为您想要更改传入的原始值.

  2. 通过仅传递引用(即C++术语中的指针)来加速它.

第一个不适用于你的代码,第二个对于这样的小结构似乎毫无意义(实际上,所有结构都应该很小,因此它几乎不适用于设计良好的结构).