在不同的类c#中使用“this”关键字

时间:2014-09-17 21:43:19

标签: c# xaml

我制作了一个按原样工作的程序,但是我希望通过将一些逻辑移动到其他.cs文件中来更好地组织代码。在移动一些代码时,我注意到代码正在re"这个"用于更改应用程序宽度/高度的关键字不再起作用,而且我没有运气试图获得#34;这个",请帮助

int heightd = (int)this.Height;

编辑:进一步澄清。我的mainwindow.xaml.cs是我以前的所有代码。 我会用this.width来获取我的窗口宽度。

创建一个不同的.cs文件来保存相关的方法后,它打破了我的所有"这个"参考文献的。

我希望我的新cs文件能够处理"这个"从我的主程序。所以我可以称它的宽度,高度等

重新编辑:我理解"这个"从我的新类不能正常运行我只是希望能够创建使用相同对象的方法,这些对象在"这个"被重新引用。 例如,Class2可以做WorkAround.height; WorkAround可以处理任何"这个"在第1课。

Soution:在新类中更新签名以接受主窗口:

public static void Marginnn(MainWindow aplication)
    {

发送"这个"在通话期间从主要班级:

WindowsInterop.Marginnn(this);

3 个答案:

答案 0 :(得分:2)

其他人讨论了部分类,这可能会有问题。对于这个答案,我假设通过"移动到另一个.cs文件"你的意思是"搬到另一个班级,"正如你的标题所示。

this关键字实际上是一个变量,它引用了"拥有的实例"目前的方法。如果将方法移动到另一种类型,则实例不再是该方法的所有者。相反,您需要将对实例的引用传递给方法。这将是一个方法参数,其名称不是this

实施例;之前:

class App
{
    public void DoSomethingWithTheHeight()
    {
        int heightd = (int)this.Height;
        //more code
    }
    public void CallDoSomethingWithTheHeight()
    {
        this.DoSomethingWithTheHeight();
    }
}

任务:将DoSomethingWithTheHeight移动到新的静态类:

class App
{
    public void CallDoSomethingWithTheHeight()
    {
        NewClass.DoSomethingWithTheHeight(this);
    }
}

static class NewClass
{
    public static void DoSomethingWithTheHeight(App application)
    {
        int heightd = (int)application.Height;
        //more code
    }
}

任务:将DoSomethingWithTheHeight移动到新的非静态类:

class App
{
    public void CallDoSomethingWithTheHeight()
    {
        NewClass instanceOfNewClass = new NewClass();
        instanceOfNewClass.DoSomethingWithTheHeight(this);
    }
}

class NewClass
{
    public void DoSomethingWithTheHeight(App application)
    {
        int heightd = (int)application.Height;
        //more code
    }
}

还有其他可能性,但这些例子应说明基本原则。

答案 1 :(得分:1)

如果您只想将类的一部分移动到另一个文件并仍然使用this,则必须使用部分类。但是我不推荐这种方法,你的代码显然需要一些重构。

答案 2 :(得分:1)

C#keyword this指的是它正在使用的类的当前实例。它可以用于其他一些东西,例如扩展方法的第一个参数的修饰符,但是我们在这里不用担心。因此,您只能在其引用的类中使用this,并注意它可能不会与static类,方法,字段等一起使用...因为它们有没有与他们相关的实例。

如果您引用的代码未在partial类中实现,则必须引用Window的实例。否则,无法判断this是什么。由于我们不知道您是如何构建程序的,因此很难推荐一种获取相关Window实例的方法。例如,如果您使用MVVM模式,您甚至不需要在代码中与UI实例进行交互。但是,如果您正在使用代码隐藏模型,那么最好的办法就是为该窗口创建一个partial类。就像我说的那样,在不了解环境的整个范围的情况下,很难知道你的情况是什么。

有很多方法可以解决这个问题,而且有些方法比其他方法更为苛刻:

// In the code-behind of a window...
public static MyWindow Instance { get; private set; }
public MyWindow()
{
     Initialize();
     Instance = this;
}

// Somewhere else in your program...
var someValue = MyWindow.Instance.SomeControl.Value;

请注意,上述代码仅用于演示目的,而不是我建议做的事情(它甚至不会考虑null,但这很容易解决)。它只是一个示范,表明几乎有无数种方法可以解决您的问题。理想情况下,如果您不使用MVVM,我可能会实现一个窗口管理器类来处理所有应用程序窗口的实例。

相关问题