C#强制使用默认值而不是非静态调用静态函数

时间:2018-11-22 10:35:13

标签: c# object static

我有一个对象来管理ini文件。

我将此对象设计为蜜蜂有两种使用方式:静态和非静态。因此,当我只需要一个值时,可以直接调用IniFile.Read,也可以实例化IniFile Object并执行一些操作。所有非静态函数都调用静态等效项,myIniFile.Read(sectionName, value, defaultValue)调用IniFile.Read(iniPath, sectionName, value, defaultValue)Read()函数的最后一个参数为默认值。

我的问题是,当我调用IniFile.Read()函数时,编译器不知道我是调用静态函数还是调用另一个函数。有办法解决这个问题吗?

public static string ReadValue(string filePath, string section, string key, string defaultValue="")
public string ReadValue(string Section, string Key, string defaultValue="")

3 个答案:

答案 0 :(得分:2)

调用静态函数:

ClassName.Function();

对于非静态:

ClassName class_name = new ClassName();

class_name.Function();

答案 1 :(得分:1)

消除歧义的另一种方法-根据定义,您必须具有不同的签名,那就是使用命名参数;例如:

const NewsStack = createStackNavigator({
  News: NewsScreen,
});

NewsStack.navigationOptions = {
  tabBarLabel: 'News',
  header: null,
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={
        Platform.OS === 'ios'
          ? `ios-information-circle${focused ? '' : '-outline'}`
          : 'md-information-circle'
      }
    />
  ),
};

const AbosStack = createStackNavigator({
  Abos: AboScreen,
});

AbosStack.navigationOptions = {
  tabBarLabel: 'Abos',
  header: null,
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? `ios-link${focused ? '' : '-outline'}` : 'md-link'}
    />
  ),
};

const MomentsStack = createStackNavigator({
  Moments: MomentsScreen,
});

MomentsStack.navigationOptions = {
  tabBarLabel: 'Moments',
  header: null,
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? `ios-options${focused ? '' : '-outline'}` : 'md-options'}
    />
  ),
};

export default createBottomTabNavigator({
  News: NewsStack,
  Abo: AbosStack,
  Moment: MomentsStack,
});

答案 2 :(得分:0)

如果使用类型名称显式地为方法添加前缀,则它应调用静态方法;例如:

public void InstanceCallSite()
{
    ReadValue("a", "b", "c");
    // or in the general case: someInstance.ReadValue("a", "b", "c");
    Foo.ReadValue("a", "b", "c");
}

public static void StaticCallSite()
{
    ReadValue("a", "b", "c");
}

public static string ReadValue(string filePath, string section, string key, string defaultValue = "")
{
    Console.WriteLine("static");
    return "";
}
public string ReadValue(string Section, string Key, string defaultValue = "")
{
    Console.WriteLine("instance");
    return "";
}

InstanceCallSite用法输出:

instance
static