在C#中为函数名创建别名

Gho*_*ngi 15 c# alias

我想在C#中为funcion名称创建一个别名.

除了函数重载有什么办法吗?

public class Test
{
    public void A()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在下面打电话给B替换A.

var test = new Test();
test.B();
Run Code Online (Sandbox Code Playgroud)

Chr*_*vén 27

没有人提到过,我很惊讶代表们.它可能与C#中的方法别名一样接近:

class DelegaTest
{
    public string F()
    {
        return null;
    }

    public string F(int arg)
    {
        return arg.ToString();
    }

    public void G(int arg1, int arg2)
    {
    }

    /// <summary>
    /// Delegate for `string F()`
    /// </summary>
    public Func<string> D1 => F;

    /// <summary>
    /// Delegate for `string F(int arg)`
    /// </summary>
    public Func<int, string> D2 => F;

    /// <summary>
    /// Delegate for `void G(int arg1, int arg2)`
    /// </summary>
    public Action<int, int> E => G;
}
Run Code Online (Sandbox Code Playgroud)

  • _This_应该是公认的答案. (3认同)

Che*_*eso 12

您可以使用扩展方法

public static class Extensions 
{
    public static void B(this Test t)
    {
       t.A();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不是别名.这是一个包装.


编辑
ps:我同意你的问题的评论者,如果我们知道你真正想做什么,如果我们理解你想要解决的问题,我们就能给出更好的答案.

我真的没有看到产生上述扩展方法的重点.


小智 9

这太老了,但我有一个关于为什么一个人可能想要别名方法名称的回应。它一直在发生。因为某些开发人员给方法起了一个没有任何意义的名称,或者只是没有准确描述方法的用途。该方法在旧的、经验丰富的解决方案中被多次调用。因此,与其执行因方法命名不当而无法证明的大型重构和重新测试,不如简单地给它一个有意义的别名。这样,新代码将在未来正确读取。

即保存了一个网格控件,还有一个方法名IsReferenceSelectedSendEmail。该名称暗示该方法将识别用户在网格中选择的引用是否为 SendEmail。该方法的真正作用是遍历所有引用并确定其中是否有任何一个是 SendEmail。

简单的解决方案。将方法别名为 AnyReferenceIsSendEmail,以便将来的代码可以正确读取:if ( AnyReferenceIsSendEmail() )...

现在,如果我们能得到一个关键字“除非”来否定一个 if 条件。

海事组织


Teo*_*gul 5

实际上,函数别名更多是C#术语中的委托(就像C++中的函数指针一样).这是一个:

public class Test
{
    public void Test()
    {
        B += A;
    }

    public void A()
    {
        ...
    }

    public Action B;
}
Run Code Online (Sandbox Code Playgroud)

但是你必须将它称为B.Invoke(),因为它是无参数的.如果它有一个或多个参数,这不会是一个问题.

  • 实际上你可以在没有`Invoke()`的情况下调用B. 只是`Test.B();` (5认同)