为什么在C#中不允许使用静态索引器?我认为没有理由不应该允许使用它们,而且它们可能非常有用。
例如:
public static class ConfigurationManager { public object this[string name] { get => ConfigurationManager.getProperty(name); set => ConfigurationManager.editProperty(name, value); } /// <summary> /// This will write the value to the property. Will overwrite if the property is already there /// </summary> /// <param name="name">Name of the property</param> /// <param name="value">Value to be wrote (calls ToString)</param> public static void editProperty(string name, object value) { var ds = new DataSet(); var configFile = new FileStream("./config.xml", FileMode.OpenOrCreate); ds.ReadXml(configFile); if (ds.Tables["config"] == null) ds.Tables.Add("config"); var config = ds.Tables["config"]; if (config.Rows[0] == null) config.Rows.Add(config.NewRow()); if (config.Columns[name] == null) config.Columns.Add(name); config.Rows[0][name] = value.ToString(); ds.WriteXml(configFile); configFile.Close(); } public static void addProperty(string name, object value) => ConfigurationManager.editProperty(name, value); public static object getProperty(string name) { var ds = new DataSet(); var configFile = new FileStream("./config.xml", FileMode.OpenOrCreate); ds.ReadXml(configFile); configFile.Close(); if (ds.Tables["config"] == null) return null; var config = ds.Tables["config"]; if (config.Rows[0] == null) return null; if (config.Columns[name] == null) return null; return config.Rows[0][name]; } }
上面的代码将从静态索引器中受益匪浅。但是,由于不允许使用静态索引器,因此无法编译。为什么会这样呢?
索引器符号需要引用this。由于静态方法没有对类的任何特定实例的引用this,因此您不能与它们一起使用,因此,不能在静态方法上使用索引器符号。
this
解决问题的方法是使用单例模式,如下所示:
public class Utilities { private static ConfigurationManager _configurationManager = new ConfigurationManager(); public static ConfigurationManager ConfigurationManager => _configurationManager; } public class ConfigurationManager { public object this[string value] { get => new object(); set => // set something } }
现在您可以Utilities.ConfigurationManager["someKey"]使用索引器符号进行调用。
Utilities.ConfigurationManager["someKey"]