2016-11-21 9 views
0

私はクラスUserに関数SerializeUserを持っています。 この関数にはパラメータはありません。私は、関数のこれらの2つのタイプに異なる機能を持つようにしたい関数呼び出しが静的かどうかを確認する

コール:

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

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

は、それが静的な関数呼び出しまたは非静的関数であるかどうかを確認することが可能ですコール?

+1

あなたは、これらを別の名前を付けることができ...?!しかし、いいえ、あなたの例で示したコードを書くことはできません。親切に*あなたがそのような忌み嫌いをしたい理由を説明してください! –

+1

静的でない 'SerializeUser'と静的' SerializeUser'を同じクラスに持つことはできません。しかし、なぜあなたはこれをしたいですか? – Amy

+0

「チェック」とはどういう意味ですか?最初のサンプルは 'static'メソッドを呼び出し、2番目のサンプルはインスタンスメソッドを呼び出します。 (注:コンパイラでは、それ以外は同じメソッドを使用できるとは思えませんが、誤解を招く可能性があります)。実際にここで何を達成しようとしているのかは分かりません。 – David

答えて

4

いいえ、関数は静的でも非静的でもありません。

あなたはになります。 doは、異なる署名が必要ですが、静的と静的ではない2つのメソッドを作成します。引数を受け入れないようにするには、別の名前を付ける必要があります。インスタンス上で動作し、別のインスタンスで動作していることを前提にして、メソッドが何をしているのかについて、名前に反映する必要があることは、少なくとも多少異なります。

0

Userオブジェクトに1つのメソッドSerializeUser()を定義すると、それが静的でない限り、User.SerializeUser()に電話をかけることはできません。 の静的であれば、new User().SerializeUser()を実行することはできません。同じ名前かどうかの2つの方法でしか実行できません。また、コンパイラが解決できるようにシグネチャを区別すれば同じ名前を持つことができますどちらを使うか。

インスタンスメソッドは、静的メソッドの引数としてインスタンスを渡し、静的メソッドは、パラメータとしてインスタンスを受け入れ、すなわち場合はがしたいのだ何かがあるとして、これは理にかなっている唯一の方法:

デフォルト値のブール値やデフォルト値を使用しないなど、別の方法で区別することもできます。 Ex。静的メソッドに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. 
     } 
    } 
} 
関連する問題