【问题标题】:Use static function from a class without naming the class使用类中的静态函数而不命名类
【发布时间】:2014-08-14 04:00:06
【问题描述】:

如何在不必每次都命名该类的情况下从一个类中访问函数?我知道如何使用“使用”,这样我就不必命名命名空间,但我希望有一种方法可以处理这个静态函数,这样我就可以像在同一个类中调用函数一样调用它们.

【问题讨论】:

  • 你为什么认为这会起作用?当您有两个具有相同名称和签名的静态方法时,编译器会做什么?
  • 两个命名空间不能发生同样的事情吗?我想象如果发生冲突,编译器会通知我。
  • 该功能暂定为next version of C#;你可以说using System.Console;,然后只说Write(...)
  • @PrestonGuillot 为什么有人会这么想?因为类(除其他外)是命名空间,没有理由可以用简单的命名空间(如using 它们)做一些你不能用类做的事情。

标签: c# function class namespaces


【解决方案1】:

使用静态 yournamespace.yourclassname;

然后调用不带类名的静态类方法;

例子:

Class1.cs

namespace WindowsFormsApplication1
{
    class Utils
    {
        public static void Hello()
        {
            System.Diagnostics.Debug.WriteLine("Hello world!");
        }
    }
}

Form1.cs

using System.Windows.Forms;
using static WindowsFormsApplication1.Utils;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            Hello();    // <====== LOOK HERE
        }
    }
}

【讨论】:

  • 这是正确答案!谢谢。您可以通过代码示例对其进行改进。
  • 能否请您澄清这一点以指定这仅在 C# 6 或更高版本中才有可能?问题很老了,可能提问者没有升级的可能。
【解决方案2】:

如果您要定义一个全局范围的过程,那么简短的回答是否定的,您不能在 c# 中执行此操作。没有全局函数、过程或对象。

在 C# 中,除了命名空间和类型(类、结构、枚举、接口)之外的所有内容都必须在类型中定义。静态成员(字段、属性和方法)可以在没有类实例的情况下使用,但只能通过引用拥有它们的类型来使用。非静态成员需要所属类的实例。

这是语言语法的基础。 C# 既不是 C 也不是 C++,您可以在其中定义全局对象、函数和过程。

【讨论】:

    【解决方案3】:

    在 C# 中?不可能。因为它是一种完整的 OOP 编程语言,并且它被设计为与对象一起工作,所以您不能使用对象范围之外的函数。调用静态方法时,您必须指定该静态方法所在的类...

    Class.StaticMethod();
    

    如果此方法是从同一个类中调用的,则只能使用简写符号...

    StaticMethod();
    

    但请记住,您将无法访问实例成员,因为静态方法不属于对象的实例

    根据评论更新

    看起来可以调用静态成员而无需指定在 C# 6 中声明它的类,并且您将能够直接在 using 语句中引用类......以类似于 Java 的方式...... .more info here

    【讨论】:

    • 但是如果它们是静态的,你当然可以在没有对象的情况下使用它们。
    • 课程范围之外?不在 c# mate 中
    • Class.StaticMethod() 中的对象到底在哪里?请记住,它可以被称为static Class() { StaticMethod(); }。不涉及任何对象。
    • 你到底在说什么? Class.StaticMethod() 不是一个对象,它是一个语句,一个方法调用
    • @PeterSchneider 队友,你完全脱离了上下文,你真的读过你评论的答案吗?
    【解决方案4】:

    我经常有

    static Action<object> o = s => Console.WriteLine(s);
    

    在我的代码中,这使得调试输出的噪音大大降低。这样我就可以更容易地调用控制台的静态 Writeline()。会有帮助吗?

    【讨论】:

    • -1 这不是一个静态方法,这实际上是一个委托。此外,您将无法从定义委托的类外部访问它
    • 我试图表明您可以调用静态方法 Console.Writeline() 而无需每次都提及 Console。你用o("Hello World");调用它。
    • 您可以将其简化为static Action&lt;object&gt; o = Console.WriteLine;
    • @hypehuman 有趣,谢谢!我现在无法对其进行测试,但如果您确定可以将其添加到帖子中。
    • 或者static Action&lt;object&gt; o =&gt; Console.WriteLine; 会更好。我的猜测是编译器最终可能会内联该调用。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2010-11-28
    • 1970-01-01
    • 2020-10-12
    • 2012-10-18
    相关资源
    最近更新 更多