【问题标题】:Determine if function call is static确定函数调用是否是静态的
【发布时间】:2016-11-21 15:27:08
【问题描述】:

我在 User 类中有一个函数 SerializeUser。 此函数没有参数。

我想在这两种类型的函数调用中有不同的功能:

User.SerializeUser(); //Do sth...

User u = new User();
u.SerializeUser(); //Do sth else...

是否可以检查是静态函数调用还是非静态函数调用?

【问题讨论】:

  • 你可以给它们起不同的名字...?!但是不,您不能编写示例中给出的代码。请解释为什么你会想要这样一个可憎的!
  • 您不能在同一个类上同时拥有非静态 SerializeUser 和静态 SerializeUser。但是你为什么要这样做呢?
  • “检查”是什么意思?您的第一个示例调用static 方法,您的第二个示例调用实例方法。 (注意:我怀疑编译器是否允许您使用其他相同的方法,但我可能会弄错。)目前还不清楚您在这里实际尝试完成什么。
  • 看起来很混乱,他们肯定会做完全不同的事情,因此应该得到更多描述性的名字。

标签: c# function static


【解决方案1】:

不,一个函数不能既是静态的又是非静态的。

可以做的是创建两种方法,一种是静态的,一种是非静态的,尽管它们需要有不同的签名。如果您不希望它们都接受任何参数,则它们必须具有不同的名称,无论如何这可能是最好的;考虑到一个对一个实例起作用而另一个不是,几乎可以肯定的是,这些方法的作用至少有些不同,您应该在它们的名称中反映出来。

【讨论】:

    【解决方案2】:

    我认为您在这里感到困惑的是,如果您在 User 对象上定义一种方法 SerializeUser(),您将无法调用 User.SerializeUser(),除非它是静态的。如果它静态的,那么你将无法做到new User().SerializeUser() - 你只能用两种方法来做这两个方法,同名与否,如果你区分,你只能有相同的名字它们的签名,以便编译器可以解析使用哪一个。

    如果实例方法将实例作为参数传递给静态方法,并且静态方法接受一个实例作为参数,那么这对于您想要做的事情是有意义的。 ,即:

    namespace MyNamespace
    {
        public class MyClass
        {
            public static void Method(MyClass c = null)
            {
                if (c == null)
                {
                    //Do Stuff From Static
                }
                else
                {
                    //Do Different Stuff With Instance
                }
            }  
    
            public void Method()
            {
                Method(this);
            }
        }
    }
    

    您还可以使用其他东西来区分它们,例如具有默认值或没有默认值的布尔值。前任。如果静态方法有一个bool flag = false 参数,那么实例方法可以用flag = true 调用它,然后你可以使行为区分。不过,这是有点讨厌的代码,因为它隐藏了棘手的重载解析背后的方法。

    要直接回答您的问题,您可以使用MethodBase.GetCurrentMethod().IsStatic 检查当前方法是否是静态的,但我认为在这种情况下这实际上对您没有用处。

    不过,看看你的代码,我想你想要的是这样的:

    namespace MyNamespace
    {
        public class User
        {
            public static string SerializeUser(User u = null)
            {
                if (u != null)
                    return u.SerializeUser();
                else
                    return "something"; //default(User).SerializeUser();?
            }
        }
    
        public static class UserExtensions
        {
            public static string SerializeUser(this User u)
            {
                //return however you serialize your user.
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多