C#、 WINFORM以及 .NET之间关系。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#、 WINFORM以及 .NET之间关系。相关的知识,希望对你有一定的参考价值。

如题。

简单地讲.net包括一个解析应用程序代码的类库以及一个支持程序运行的平台。
何谓平台:
比方说exe可执行文件可以在Windows上运行,却不能在Linux上面运行。操作系统本身就是一个运行平台。底层的API等可以看做类库。所有在Windows上运行的程序其实都只是对底层API直接或间接地调用,扩展了操作系统的功能而已。
.net之前的Windows程序在写完后被编译成二进制的exe文件。它们可以直接被操作系统解释并送到CPU里面运行。也就是说Windows就是这些程序运行的平台。
问题1:
不光Windows与Linux是不同的运行平台。Windows的不同版本也是不同的运行平台。因为它们的操作系统内核或多或少不一样。API的类库也存在差异。如果各个版本的Windows内核不能完全兼容,就会导致如下问题:如果某程序编写的时候调用了某个特定版本Windows的某个函数,并且该函数在其它版本的Windows内核中都没有,那么把该程序发布到其它版本的Windows至上就会出现运行时错误。运行到一半发现找不到某个函数……这是一个问题。
另一个显著的问题是:
编程语言何其之多。如果写C语言的人能够调用B语言编写的组件。那么代码的重用性就得到了极大程度上的增强。
.net
.net出现后解决了很多问题。当然包括这两个问题。.net支持很多种语言。但是C#才是为.net量身定做的语言。打个比方,地球上一部分人讲汉语,一部分人讲英语,一部分人讲鸟来语。但是英语是比较公认的官方语言。说不同语言的人如果不懂对方的语言显然不能沟通。如果有个翻译就OK了。
.net本质也只是对API进行了更安全的封装,也只是Windows的一种扩展而已。但是它之所以独立于Windows之上成为一个运行平台,是因为.net编写的程序并没有直接编译成Windows能够理解的二进制文件。而是编译成了.net的中间语言。好比我们重新定义了一种国际语言。它既不是英语也不是汉语,不是现存的任何语言。但是它可以用来翻译现存的所有语言。正因为程序被编译成了中间语言,它们在这个层面上可以自由地交流。所以C#之类的C型语言可以跟VB型的B型语言等互相访问。也正因为它们被编译成了一种操作系统不认识的中间语言,它们才需要有一个解析平台(公共语言运行时,也是.net的一个部分)。.net相当于同时充当了程序与Windows之间的翻译官与字典的功能。
Winform
这个这个……当你学会了一种语言的时候,你可以用它来唱歌,也可以用它来写诗。
当你要唱歌或者要写诗的时候,你可以用任何一种语言。Winform说到底不就是编程
语言的一件艺术品么?
参考技术A NET是一个平台,这个平台支持很多东西,很多编程语言,C#只是其中的一种,还有VB.NET,F#等语言,使用.NET这个平台开发的程序不能直接在Windows上运行,需要安装一个叫做Net framework的东西,目前最新版本是4.0,Windows7系统已经集成了net framework 3.5

C#只是一门标准化的语言,它的语法是经过国际标准化组织标准过的,并不是只有.NET支持C#语言,Linux下面有个Mono平台,也支持C#

WINFORM是指开发Windows桌面程序的一种模式,当然它并不是只有模式,也提供了很多使用的控件,可以方便地构建一个Windows桌面程序。其实开发Windows桌面程序有很多种方法,用C语言直接调用Windows API就是一种很原始的方式,在VC++里面可以使用MFC这种模式,而到了.NET,则提供了WINFORM这种模式!
参考技术B .NET一个平台,一个框架
C#是一种语言
WINFORM是指开发Windows桌面程序的一种模式

稍微解释一下,这些东西随着你学习的深入就会理解了。

.NET是一个平台,这个平台支持很多东西,很多编程语言,C#只是其中的一种,还有VB.NET,F#等语言,使用.NET这个平台开发的程序不能直接在Windows上运行,需要安装一个叫做Net framework的东西,目前最新版本是4.0,Windows7系统已经集成了net framework 3.5

C#只是一门标准化的语言,它的语法是经过国际标准化组织标准过的,并不是只有.NET支持C#语言,Linux下面有个Mono平台,也支持C#

WINFORM是指开发Windows桌面程序的一种模式,当然它并不是只有模式,也提供了很多使用的控件,可以方便地构建一个Windows桌面程序。其实开发Windows桌面程序有很多种方法,用C语言直接调用Windows API就是一种很原始的方式,在VC++里面可以使用MFC这种模式,而到了.NET,则提供了WINFORM这种模式!
参考技术C .NET是语言的开发平台,C#是在这平台上的兼容开发语言,WINFORM是.NET用于窗体开发的 参考技术D .net是一种语言,c#是基于.net的一种开发工具,winform是c#开发的一种程序。

C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别

【中文标题】C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别【英文标题】:C# winform: Accessing public properties from other forms & difference between static and public properties 【发布时间】:2013-01-17 19:02:09 【问题描述】:

我试图了解静态属性和公共属性之间的区别。但是当我尝试以其他形式访问我的公共属性“测试”时,它显示为“空”。

这里是Form1:

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private string _test;

    public string Test
    
        get  return _test; 
        set  _test = value; 
    

    private void Form1_Load(object sender, EventArgs e)
    
        _test = "This is a test";
    

    private void button1_Click(object sender, EventArgs e)
    
        Form2 frm2 = new Form2();
        frm2.Show();
    

这是 Form2:

public partial class Form2 : Form

    public Form2()
    
        InitializeComponent();
    

    private void Form2_Load(object sender, EventArgs e)
    
        Form1 frm1 = new Form1();
        label1.Text = frm1.Test;
    

为了检查 Form1 中 'Test' 的值,我在这一行设置了一个断点:

label1.Text = frm1.Test;

但该值为“空”。

请帮助我如何访问其他表单的公共属性。

顺便说一句,我试图让这个公共属性成为“公共静态”。我可以使用这个来访问它:

Form1.Test

但我注意到我可以从 Form2 更改我不希望发生的“测试”值。这就是为什么我试图使用公共财产但没有运气的原因。有人可以澄清我这些事情。感谢您的所有帮助!

EDIT: (For follow up question) 

John Koerner 爵士的回答是我问题的最佳答案。但我有一个后续问题,我试图将这些“测试”属性设为“静态”,我注意到即使我将此属性设为静态或公共属性,它仍然可以在 Form2 中编辑。为了让自己清楚,这里有一个示例:

public partial class Form2 : Form

    private Form1 f1;
    public Form2(Form1 ParentForm)
    
        InitializeComponent();
        f1 = ParentForm;
    

    private void Form2_Load(object sender, EventArgs e)
    
        label1.Text = f1.Test;
    

    private void button1_Click(object sender, EventArgs e)
    
        f1.Test = "This test has been changed!";

        this.Close();
    

Form2 关闭后,我再次尝试在 Form1_Load 中中断以检查 'Test' 的值,结果改变了!如何将 Form1 中的公共属性设置为在 Form2 中只读且无法编辑?请向我澄清。非常感谢各位!

【问题讨论】:

【参考方案1】:

您的属性是一个实例变量,因此Form1 的不同实例的值可能不同。

如果您尝试从父窗体访问实例变量,最简单的方法是将 Form1 传递给 Form2 的构造函数。

public partial class Form2 : Form

    private Form1 f1;
    public Form2(Form1 ParentForm)
    
        InitializeComponent();
        f1 = ParentForm;
    

    private void Form2_Load(object sender, EventArgs e)
    
        label1.Text = f1.Test;
    

那么当你从 Form1 创建一个新的 Form2 时,你可以这样做:

Form2 frm2 = new Form2(this);

如果你希望你的属性是只读的,你可以不指定一个 setter:

public string Test

    get  return _test; 

【讨论】:

感谢这个人,请查看我对后续问题的编辑,我希望我的问题很清楚。 就是这样!感谢您的帮助约翰!你的好课!对不起,我是新手 :(【参考方案2】:

frm1 不是您的主要表单对象。它是新创建的对象,其中属性Test 在加载时初始化(在Form1_Load 事件处理程序中)。

【讨论】:

【参考方案3】:

Form1 的第一个实例显示Form2 的一个实例,然后Form2 创建Form1另一个 实例。这可能有效,但您在 Form.Load 事件中设置了 _test,其中:

在第一次显示表单之前发生。

您没有显示您尝试从中读取TestForm1 实例,因此它的Load 事件不会发生并且Test 仍然是null

您可以添加构造函数重载或属性来传递 Form1 引用,正如@JohnKoerner 提到的那样,但我更愿意只传递所需的变量,甚至可能封装在一个事件中,以减少耦合。 Form2 通常不需要知道Form1 的全部。

【讨论】:

【参考方案4】:

公开

同一程序集或引用它的其他程序集中的任何其他代码都可以访问该类型或成员。

静态

类上的 static 修饰符意味着该类不能被实例化,并且它的所有成员都是静态的。静态成员有一个版本,无论创建了多少其封闭类型的实例。

静态类与非静态类基本相同,但有一个区别:静态类不能被外部实例化。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以使用类名本身来访问静态类的成员。

但是,有一个静态构造函数。任何类都可以有其中之一,包括静态类。它们不能直接调用并且不能有参数(除了类本身的任何类型参数)。在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。看起来像这样:

静态类 Foo() 静态 Foo() 酒吧=“富巴”;

public static string Bar  get; set; 

静态类通常用作服务,您可以这样使用它们:

MyStaticClass.ServiceMethod(...);

【讨论】:

【参考方案5】:

使用这个方法'静态'

一开始控制标签属性Modifiers=Public

在下面的程序代码中

public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();

在下面的Form1代码中

Program.frm2.show();

在下面的Form2代码中

label1.Text=Program.frm1.text; 

【讨论】:

以上是关于C#、 WINFORM以及 .NET之间关系。的主要内容,如果未能解决你的问题,请参考以下文章

C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别

.net C# winform程序定时运行代码

C# 截图工具winform

.NET 版本和 C# 版本之间的关系? [关闭]

聊一聊C#与.NET之间的关系

ASP.NET ADO.NET 和C#编程语言他们之间的关系是怎样的?