【问题标题】:How to use a method that has no return type without making it public? [closed]如何在不公开的情况下使用没有返回类型的方法? [关闭]
【发布时间】:2013-04-30 09:51:21
【问题描述】:

我有一个类,其中包含一个具有两个参数的方法。我使用属性来设置这些参数的值,但我不知道如何将它们传递给方法。类名是 ZipLoad。

    private string user1;
    private string pass1;

    public string setUser
    {
        set { user1 = value ; }
    }
    public string setPass
    {
        set { pass1 = value; }
    }

    private void DOit(string uName, string pWord)
    {
      Do some stuff...
    }

我有这个代码来初始化它和所有...

    ZipLoad myZipLoad = new ZipLoad();
    myZipLoad.setUser = "abc";  // can be anything !
    myZipLoad.setUser = "abc123";

接下来我该怎么做才能使用该方法?

谢谢。

【问题讨论】:

  • Don't know how to pass them to the method 使用哪种方法?没看懂问题...如果你的意思是Doit方法,那么你就不需要把它们作为参数传递,直接访问就可以了。
  • 如果您希望能够从类外部调用它,为什么要将方法声明为私有?
  • 您的问题非常不清楚。您何时尝试调用该方法,这与公开有什么关系?为什么你的房产名字这么奇怪?
  • 你应该看看work在.Net中的属性
  • 我不想公开 DOit 方法。我想使用我创建的属性设置用户名和密码。我想提供我在这些属性中设置的值给 DOit 方法。希望能解决问题...

标签: c# oop class methods


【解决方案1】:

这个怎么样:

public ZipLoad(string uName,string pWord)
{
user1= uName;
pass1=pWord;
DOit(uName,pWord);
}
private string user1;
private string pass1;

private void DOit(string uName, string pWord)
{
  Do some stuff...
}

然后你可以调用它

ZipLoad myZipLoad = new ZipLoad("name","pw");

【讨论】:

  • 您忘记传递参数,这将导致编译器错误。
  • 如果我这样做,是否还需要字符串 user1, pass1 ?
【解决方案2】:

不是很清楚 DOit 方法是什么,但如果它在 ZipLoad 内部,你可以只使用字段,考虑到属性只有 set,出于某种原因。

所以:

public class ZipLoad  {
 .... 
    private void DOit(string uName, string pWord)
    {
      Do some stuff...
    }

    //someone calls it 
    DOit(user1 , pass1);
 ....
}

但我会做的是在内部也使用属性,所以像这样定义它们:

public string setUser
{        
    get {return user1}
}
public string setPass
{
    get{ returnpass1 ; }
}

并从类的ctor设置字段的值,考虑到这些是属性 为了能够使用一个对象而必须具备的(至少就我从提供的代码中所理解的那样)

【讨论】:

    【解决方案3】:

    如果您有设置user1pass1 的属性,并且您的DOit 方法设置为private,则实际上不需要将参数传递给此方法。

    您可以简单地初始化您的 ZipLoad 对象:

    ZipLoad myZipLoad = new ZipLoad();
    myZipLoad.setUser = "abc";  // can be anything !
    myZipLoad.setPass = "abc123";
    

    就像你已经做的那样,然后在DOit 方法中使用属性值。所以方法可以不带参数重新定义:

    private void DOit()
    {
        Do some stuff...
    }
    

    【讨论】:

    • 哦,现在我明白了。非常感谢你。现在我明白大家在说什么了。感谢一百万次。
    • @WaqasAli :) 不客气
    • 好的,我已经按照你说的做了,现在如何调用 DOit() 方法? !
    • @WaqasAli 因为它是一个私有方法,它只能被您的ZipLoad 类中的另一个方法调用。它可以是公共方法或另一个私有方法...
    • 所以你的意思是我必须创建一个公共方法来调用私有方法?
    【解决方案4】:

    当您通过属性设置方法中使用的值时,您无需再次将它们传递给方法。

    但是,如果这些变量只在方法中使用(并且不需要存储在 ZipLoad 类中),则删除属性并使用以下内容:

    myZipLoad.DOit("abc", "abc123");
    

    不过,您必须公开 DOit 方法。

    【讨论】:

      【解决方案5】:

      你需要让你的方法public,你不需要将用户名和密码传递给方法,你可以简单地在方法中使用它们。

      public void DOit()
          {
             //you can reach your parameters from here...
          }
      

      所以你可以这样使用:

          ZipLoad myZipLoad = new ZipLoad();
          myZipLoad.setUser = "abc";  // can be anything !
          myZipLoad.setUser = "abc123";
          myZipLoad.DOit();
      

      【讨论】:

        【解决方案6】:

        使用访问修饰符的最基本原则是您要设置什么级别的权限。使用私有意味着它是最低访问级别。那么,你为什么要设计一些私人的东西并想作为公共的东西使用。而是使用 public 代替。

        有关可访问性级别,请参阅 MSDN:

        http://msdn.microsoft.com/en-AU/library/ba0a1yw2(v=vs.71).aspx

        【讨论】:

          【解决方案7】:

          这里似乎有很多混乱。如果我对您的理解正确,您有两种选择,具体取决于您想做什么。

          如果你可以改变你的方法签名,你可以这样做:

          private string user1;
          private string pass1;
          
          public string setUser
          {
              set { user1 = value ; }
          }
          public string setPass
          {
              set { pass1 = value; }
          }
          
          private void DOit() // Note: No parameters here!
          {  
              // use setUser and setPass directly here, like:
              var user = setUser;
              Do some stuff...
          }
          

          如果您不能更改方法签名,并且出于某种原因(可能是测试目的,或其他原因?)绝对希望将值作为参数传递,那么重载可能是一种选择:

          private string user1;
          private string pass1;
          
          public string setUser
          {
              set { user1 = value ; }
          }
          public string setPass
          {
              set { pass1 = value; }
          }
          
          // New method, just to call the other one:
          private void DOit() 
          {  
              // Just call the original method, with 
              // the properties as parameters:
              DOit(setUser, setPass);
          }
          
          // Your original method:
          private void DOit(string uName, string pWord) 
          {  
              Do some stuff...
          }
          

          【讨论】:

          • 是的,我可以更改方法签名,但该方法仍然是私有的。那我该怎么称呼它呢?
          • 我想我可能误解了你的问题。我认为该方法是从类中的其他地方调用的(在这种情况下,它可以是私有的)。如果您想从类外部调用该方法,它必须要么是公共的(或者可能是受保护的)。否则,您将不得不从类中调用它——例如从不带参数的DOit() 方法中调用它——但是that 方法必须是公共的。然后是您的最后一个选择,即从构造函数中调用它(如 Cloudsan Chen 提供的答案)。
          • 好的,感谢您的帮助
          猜你喜欢
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 1970-01-01
          • 2021-01-08
          • 1970-01-01
          • 2012-02-09
          • 2019-06-11
          • 1970-01-01
          相关资源
          最近更新 更多