Jon*_*eet 27
例如,在C#中无法做到这一点 - 没有直接等同于Java的静态导入功能.
有关这种情况的更多信息,请参阅Eric Lippert关于该主题的帖子以及类似的SO问题.
但是,在某些情况下,编写扩展方法可能是有意义的,这些方法存在于非嵌套的静态类中,但"假装"为不同类的实例方法.在介绍它们之前,值得仔细思考,因为它们可能令人困惑 - 但是当明智地使用它们时它们也可以提高可读性.
你在想什么样的实用方法?
Rob*_*les 15
Jon Skeet没有告诉你的是你可以在c#中拥有全局静态成员.您的实用程序类确实可以在c#中成为现实.
遗憾的是,微软已经确定构建上述成员的过程仅仅是"正常"开发,并要求您使用原始中间语言来构建它们.这种强大的模式高于常见的语法高亮和友好的图标.
这是utf-8字符的必要序列(谨慎保护):
.assembly globalmethods {}
.method static public void MyUtilMethod() il managed 
{
  ldstr "Behold, a global method!"
  call void [mscorlib]System.Console::WriteLine(class System.String) 
  ret
}
Run Code Online (Sandbox Code Playgroud)
(您可以通过从SDK命令提示符调用ilasm.exe来编译此示例,记住使用/ dll开关)
ilasm.exe输出:
Microsoft(R).NET Framework IL汇编程序.版本2.0.50727.4016版权所有(c)Microsoft Corporation.版权所有.将'globalmethods.msil'汇编到DLL - >'globalmethods.dll'源文件是ANSI
global.msil(7):warning - 对未声明的extern程序集'mscorlib'的引用.尝试自动检测
创建PE文件
发送课程:
发射场和方法:全球方法:1;
发送事件和属性:全局写入PE文件操作成功完成
编译完新创建的程序集后(例如"globalmethods.dll"),只需在Visual Studio中添加引用即可.当这完成后,你最好坐下来,因为是时候写一些真正的代码了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace TestGlobalMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            "MyUtilMethod".Call();
            Console.ReadKey();
        }
    }
    /// <summary>
    /// Reduces the amount of code for global call
    /// </summary>
    public static class GlobalExtensionMethods 
    {
        public static void Call(this string GlobalMethodName)
        {
            Assembly.Load("globalmethods")
                .GetLoadedModules()[0].GetMethod(GlobalMethodName)
                    .Invoke(null,null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
是的,你刚刚在c#中调用了一个Global方法.
*请不要使用它,仅作为示例:-)另外,您可以使用支持它们的另一种语言编写全局方法,例如VB.NET.