无法使用实例调用方法

时间:2018-06-08 12:30:45

标签: c# .net

为什么调用方法的第一种方法在以下上下文中不起作用?我试图在另一个类的另一种方法中使用:

var center = Setting.CacheInstance.GetCentres(new Request
{
}); // this does not work 

var center2= Setting.GetCentres(new Request
{
}); // this works 

类别:

public sealed class Setting 
{
    private static Lazy<Setting> lazy =
        new Lazy<Setting>(() => new Setting());

    public static Setting CacheInstance
    {
        get
        {
            if (!lazy.IsValueCreated)
                lazy = new Lazy<Setting>(() => new Setting());
            return lazy.Value;
        }
    }

    private Setting()
    {
    }

    public static  List<string> GetCentres(Request request)
    {  
        return GetCentres(request);
    }

    private static  List<string> GetCentres(Request request)
    {
          //implementation
    }

}

我在这里缺少什么?

4 个答案:

答案 0 :(得分:1)

GetCentres是静态的,因此您只能从类中调用它,而不是从实例调用它。

Setting.CacheInstance.GetCentres首先获取实例,然后尝试在其上调用静态。删除方法上的静态:

public List<string> GetCentres(Request request)
{
    return GetCentres(request);
}

答案 1 :(得分:1)

你也可以查看jon双向飞碟的这篇文章:http://csharpindepth.com/Articles/General/Singleton.aspx ..所有你想要实现的单吨模式的不同方法

第一种方式不起作用,因为它的静态方法

 var center = Setting.CacheInstance.GetCentres(new Request

GetCentres是静态方法,您无法通过isntace调用它

解决方案 - 通过实例访问remvoe static make方法,您的属性getter中没有额外的检查

public sealed class Setting 
    {
       private static Lazy<Setting> lazy =
       new Lazy<Setting>(() => new Setting());

        public static Setting CacheInstance
        {
            get
            {
                return lazy.Value;
            }
        }

        private Setting()
        {
        }

        public List<string> GetCentres(Request request)
        {

            return GetCentres(request);
        }

        //you cannot have two methos with same name and same parameter that 
        //is also issue 
        //private List<string> GetCentres(Request request)
        //{
          //implementation
        //}

    }

答案 2 :(得分:0)

GetCentres是一个静态方法,因此您将无法使用该类的实例来调用它。您需要通过使用类本身(所以Setting.GetCentres)来调用它,或者从方法中删除static限定符。您可以在the official C# Programming Guide中获得更多信息。

答案 3 :(得分:0)

在C#中,无法使用instance访问静态成员。静态成员属于该类而不是特定实例。这意味着只存在一个静态字段实例,或者您不创建任何实例。它将由所有实例共享。

Setting.GetCentres()

从GetCentres()

中删除static修饰符
public  List<string> GetCentres(Request request)
        {

            return GetCentres(request);
        }