当前位置:  开发笔记 > 编程语言 > 正文

C#中typedef的等价物

如何解决《C#中typedef的等价物》经验,为你挑选了5个好方法。

在C#中是否有typedef等价物,或者某种类似的行为?我做了一些谷歌搜索,但我看到的每个地方似乎都是负面的.目前我的情况类似于以下情况:

class GenericClass 
{
    public event EventHandler MyEvent;
    public class EventData : EventArgs { /* snip */ }
    // ... snip
}

现在,当试图为该事件实现处理程序时,并不需要火箭科学家弄清楚这会很快导致大量输入(为可怕的双关语道歉).它最终会像这样:

GenericClass gcInt = new GenericClass;
gcInt.MyEvent += new EventHandler.EventData>(gcInt_MyEvent);
// ...

private void gcInt_MyEvent(object sender, GenericClass.EventData e)
{
    throw new NotImplementedException();
}

除了在我的情况下,我已经使用了复杂类型,而不仅仅是一个int.如果有可能简化这一点,那就太好了......

编辑:即.也许键入定义EventHandler而不是需要重新定义它以获得类似的行为.



1> Jon Skeet..:

不,没有类似typedef的真正等价物.您可以在一个文件中使用'using'指令,例如

using CustomerList = System.Collections.Generic.List;

但这只会影响该源文件.在C和C++中,我的经验是typedef通常在.h文件中使用,这些文件被广泛包含 - 因此typedef可以在整个项目中使用单个文件.C#中不存在该#include功能,因为C#中没有允许您将using指令包含在另一个文件中的功能.

幸运的是,您给出的示例确实有一个修复 - 隐式方法组转换.您可以将您的活动订阅行更改为:

gcInt.MyEvent += gcInt_MyEvent;

:)


我总是忘记你可以做到这一点.也许是因为Visual Studio建议使用更详细的版本.但我按两次T​​AB而不是输入处理程序名称就可以了;)
根据我的经验(很少),你必须指定完全限定的类型名称,例如:`using MyClassDictionary = System.Collections.Generic.Dictionary ;`它是否正确?否则它似乎不考虑它上面的`using`定义.
我无法转换`typedef uint8 myuuid [16];`通过'使用"指令.`使用myuuid = Byte [16];`不编译.`using`只能用于创建**类**别名.`typedef`似乎更灵活,因为它可以为整个声明(包括数组大小)创建别名.在这种情况下还有其他选择吗?
@tunnuz:是的,你是对的 - 我会更新答案.
@natenho:不是.你最接近的可能是有一个带固定大小缓冲区的结构.

2> Jonathan C D..:

乔恩真的给了一个很好的解决方案,我不知道你能做到这一点!

我使用的有时候是从类继承并创建它的构造函数.例如

public class FooList : List { ... }

不是最好的解决方案(除非你的程序集被其他人使用),但它确实有效.


绝对是一个很好的方法,但请记住,那些(烦人的)密封类型存在,并且它不会在那里工作.我真的希望C#已经引入了typedef.这是一种迫切的需求(特别是对于C++程序员).
如果传递给接受`List `的模板方法,它也不会推断类型`Foo`.使用正确的typedef就可以了.

3> palswim..:

如果您知道自己在做什么,则可以使用隐式运算符定义一个类,以便在别名类和实际类之间进行转换.

class TypedefString // Example with a string "typedef"
{
    private string Value = "";
    public static implicit operator string(TypedefString ts)
    {
        return ((ts == null) ? null : ts.Value);
    }
    public static implicit operator TypedefString(string val)
    {
        return new TypedefString { Value = val };
    }
}

我实际上并不赞同这一点,并且从未使用过类似的东西,但这可能适用于某些特定情况.



4> Keith..:

C#支持一些事件委托的继承协方差,所以这样的方法:

void LowestCommonHander( object sender, EventArgs e ) { ... } 

可用于订阅您的活动,无需显式转换

gcInt.MyEvent += LowestCommonHander;

您甚至可以使用lambda语法,智能感知将全部为您完成:

gcInt.MyEvent += (sender, e) =>
{
    e. //you'll get correct intellisense here
};


语法是正确的,但我不会说它是"Linq语法"; 相反,它是一个lambda表达式.Lambdas是一个支持功能,使Linq工作,但完全独立于它.基本上,在任何可以使用委托的地方,您都可以使用lambda表达式.

5> OregonGhost..:

我认为没有typedef.您只能定义特定的委托类型,而不是GenericClass中的通用委托类型,即

public delegate GenericHandler EventHandler

这会缩短它.但是以下建议呢:

使用Visual Studio.这样,当你输入

gcInt.MyEvent += 

它已经提供了Intellisense的完整事件处理程序签名.按TAB,就在那里.接受生成的处理程序名称或更改它,然后再次按TAB以自动生成处理程序存根.


是的,这就是我为生成这个例子所做的.但回过头来再看一遍这个事实仍然会令人困惑.
如果你有ReSharper,它会告诉你长版本是过度的(用灰色着色),你可以使用"快速修复"来再次摆脱它.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有