【问题标题】:C# Calling variables from other classesC#从其他类调用变量
【发布时间】:2015-08-01 23:16:11
【问题描述】:

这可能很简单,但我一直只做了一个大类,从未尝试过制作clean 代码。现在我正在尝试并遇到错误..

所以,这就是想法:

class1
{
    method1 { value 1; value 2 }
    method2 { value 3; value 4 }
    method3 { uses method4 from class2 }
}

class2
{
    method4 { uses values 1-4 from class1 }
}

我通过调用:class1 c1 = new class1() in method4 和 class2 c2 = new class2 in method3。

这就是发生的事情:

  • method1, method2 生产 values 1-4
  • 方法3调用class2 c2 = new class2
  • 我进入 class2,然后进入 method4 并获得 null/0 值,而不是我在第一步中创建的值。

【问题讨论】:

  • 你确定这是c#吗?
  • 如果你想共享 data 那么那些应该是类 properties,而不是局部变量。然后class1 将需要class2实例(例如class2 c2 = new class2() 才能使用其方法和属性。
  • 你能发布一些实际代码,而不是一些很难理解的伪代码吗?不要担心,如果它错了,我们可以解决它。
  • 您可以不展示想法,而是展示实际代码吗?
  • @RonBeyer 是的,我会编辑

标签: c# class oop methods call


【解决方案1】:

与其在method4 中创建class1 的新实例,不如将当前class1 实例(可通过this 内部method3 访问)作为参数传递给此方法以获得相同的结果。

【讨论】:

    【解决方案2】:

    您需要更具体...

        class Class1
        {
            Class2 _class2;
            public Class1(Class2 class2)
            {
                _class2 = class2;
            }
            public void method3()
            {
                //call _class2.method4()
            }
        }
        class Class2
        {
            Class1 _class1;
            public Class2(Class1 class1)
            {
                _class1 = class1;
            }
            public void Method4()
            {
                //call _class1.MethodWhatever()
            }
        }
    

    【讨论】:

    • 感谢提示,我想我正在慢慢了解我应该做什么,同时我已经添加了代码,如果你想看看它会很棒并给我一些提示如何更改一些值到属性中
    【解决方案3】:

    因此,当您需要访问类中的变量时,您显然可以通过 'public' 修饰符简单地执行此操作,但是下面的示例不是最佳实践,但我们很快就会讨论...

    public class MyTestClass
    {
        public int MyAge;
    }
    

    这是一个字段——字段应该是私有的,我们应该使用一个属性来公开该字段。但是,如果您这样做了,那么您可以像这样访问它:

    var foo = new MyTestClass();
    var hisAge = foo.MyAge;
    

    当然,根据您的要求,您可能不希望用户直接访问变量,而是在对其他变量进行一些计算后获取一个值。

    你可以这样做:

    public class MyTestClass
    {
        private int _gamesPlayed;
        private int _gamesLost;
        public int NumberOfWins { get { return _gamesPlayed - _gamesLost; } } 
    }
    

    NumberOfWins 是一个属性。它计算我们的两个字段的值并返回它。看看我们如何拥有 private 修饰符,这些在该类的范围之外是看不到的。 NumberOfWins 的访问方式与前面示例中的 MyAge 相同。

    说实话,听起来你更喜欢使用伪代码或者是初学者。

    我建议查看以下文章,以了解有关我所说的更多信息。

    【讨论】:

    • 请改用MyAge 属性。
    • 感谢提示,我想我正在慢慢了解我应该做什么,同时我已经添加了代码,如果你想看看它会很棒并给我一些提示如何更改一些值转换为属性。
    【解决方案4】:

    目前还不清楚您想要实现什么以及 class1 如何与 class2 相关联。如果您的 class2 仅对第一堂课有用,那么(并且只有在那时)您可以使用嵌套类...

    class OuterClass {
        string value1;
        string value2;
        string value3;
        // ...
    
        class InnerClass 
        {
          OuterClass o_;
          public InnerClass(OuterClass o) 
          {
             o_ = o; 
          }
    
          public string GetOuterString()
          { 
            return o_.value1 + o.value2 + o.value3; //... 
          }
        }
    
        void SomeFunction() 
        {
           InnerClass i = new InnerClass(this);
           i.GetOuterString();
        }
    

    }

    这将创建一个从内部类(类 2)到外部类的清晰绑定。但这并不容易。

    编辑:好的,在你的编辑之后我看到了一个完全不同的故事..

    【讨论】:

      【解决方案5】:

      好吧,这里有一些代码给你。我不确定这是你需要的。不过,它可能会帮助您入门。你可以在这里尝试运行它:https://dotnetfiddle.net/#

      这是Class1。它通过属性公开其部分数据。

      public class Class1
      {
          // these are properties
          public int Value1 { get; set; }
          public int Value2 { get; set; }
          public int Value3 { get; set; }
          public int Value4 { get; set; }
      
          public void Method1()
          {
              Value1 = 1;
              Value2 = 2;
          }
      
          public void Method2()
          {
              Value3 = 3;
              Value4 = 4;
          }
      
          public void Method3()
          {
              // uses method4 from class2 
              var c = new Class2();
              c.Method4();
          }
      }
      

      这是Class2。它从Class1 调用方法并访问其属性。

      public class Class2
      {
          public void Method4()
          {
              //uses values 1-4 from class1 
              var c = new Class1();
      
              c.Method1();
              c.Method2();
      
              Console.WriteLine(c.Value1);
              Console.WriteLine(c.Value2);
              Console.WriteLine(c.Value3);
              Console.WriteLine(c.Value4);
          }
      }
      

      这使用了关闭并显示结果:

      using System;
      
      public class Program
      {
          public static void Main()
          {
              var c1 = new Class1();      
              c1.Method3();
          }
      }
      

      【讨论】:

      • 是的。你将不得不重写你的代码。您最初发布的代码实际上并不是 C# 代码。这是其他一些语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多