首页 新闻 会员 周边

求教各位大神,C#中怎么设置多个公共变量,使得这些公共变量可以被多个窗口中的代码重复调用、赋值、计算

0
悬赏园豆:50 [待解决问题]

      各位大神好,C #新手,也是刚注册的博客园,我的职业是一名土建结构工程师,因为工作中需要用到很多结构计算、出计算书、自动出CAD图之类的工作,所以之前自学了VB,自己编写了一个结构计算的小程序。因为VB实在太老了,而且CAD二次开发的话,C#的功能相对更强大,所以开始自学C#。但是遇到了以下几个问题:

    1.原来的VB程序计算过程需要用到大大小小几百个变量,而且是整个程序都需要用到的,比如工况一条件下,构件一的受力:Nx,Ny,Nz,Vx,Vy,Vz,Mx,My,Mz等等,VB中有公共变量的概念,很容易解决这个问题。但是这些公共变量怎么在C#中设置?这个问题当然可以通过添加一个静态公共类比如Common用于存储和改变公共变量,但这样有让我遇到了第二个问题。2.设置静态公共类存储变量后,原来VB中一个很简单的赋值语句c=a^2+b^2就要写成Common.c=(Common.a)^2+(Common)^2!(实际上这里的^甚至在C#中都不能够用作幂运算!)这还是我其中一个比较简单的公式,后面还有更复杂的!我尝试了使用using static namespace.classname 来简化公式以便可以写成c=a^2+b^2的形式,但发现不可以在program.cs里写,必须在每个form里都写上这个using语句。3.最后一个问题Common.c=(Common.a)^2+(Common)^2这个公式,我还没有考虑到c#中^并不代表幂运算,真正想要幂运算需要math函数,也就是说一个简单的c=a^2+b^2,最后要写成Common.c=Math.Pow(Common.a,2)+Math.Pow(Common.b,2)!天哪!这对于一个业余编程初学者来说简直是一个打击!难道我需要再自己自定义运算符?或者做运算符重载!我真的只是一个新手o(╥﹏╥)o。

    我的整个小程序主要就是数据计算,涉及到很多公式和赋值,这在C#中没有很好的解决方案吗?我再CSDN上也发了帖子求教,但是感觉没有得到良好的答案,真心求教博客园的各位大神!因为是新手,几乎没什么园豆,大家见谅,谢谢大家!

DQYDXT的主页 DQYDXT | 初学一级 | 园豆:152
提问于:2018-08-07 18:10

VB 代码是可以翻译成c# 代码的 ,有在线翻译,你可以试试

pengbg 5年前

你可以加一些QQ 群,之前发视频让别人远程教你,如果我现在不忙的话,之前就远程你了

pengbg 5年前

我也觉得公共变量的话,放在一个类里边会好一点

闲云渐适 10个月前
< >
分享
所有回答(15)
1

关键字static 或者传 引用(class就是引用,非引用类型可以通过ref),其他共享内存,文件....

花飘水流兮 | 园豆:13560 (专家六级) | 2018-08-07 18:17
0

公式复杂就分步计算啊,如y=a*2+b*2,你可以先算a*2啊之类,或者把某个公式定义成函数啊,函数内部变量名称总简单了吧,实在不行就复杂点也没问题,注意排版就行

美洲象 | 园豆:500 (菜鸟二级) | 2018-08-07 20:46
0

这....

我的建议是,如果你一直要定位自己是编程新手的话,还是别折腾了。

1.工具本身就有偏向性,不是说月强大的工具就对你越好用,强大有时候意味着选择太多,需要你去定制出适合自己的东西,然而你并不是能定制的人。

2. 换语言有时候很容易,2小时就能学会一个语言的基本语法。但是出问题的往往是语言的思路,理念,VBA是微软打造的专门用于应用软件增强功能的脚本级语言,如果你要用C#,本身就需要做更多的工作才能适配。

3、有的语言是给End user用的(比如你,比如VBA),有的语言是给软件开发人员开发软件给End User用的,这就要求你不是编程小白了(比如C#)。

4. 你的主要应用是数据计算,我就拿Excel 里面的Add-in为例说明吧,Excel里面有用于统计的第三方工具集,这就是专业的编程人员开发出来给你用的,而如果你自己编写,不深入学习编程理论和语言的话,当然只能使用简单的VBA做一些简单的使用大量全局变量的简单函数了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2018-08-08 09:59

第一,我是给自己的定为是C#新手,不是编程新手,我的技术水平已经能够用VB独立设计具有交互界面,计算功能,自动出报表的结构计算程序了;对于编程大牛来说还不入流,但对于我个人的工作已经足够,不知道您是哪来的优越感?。第二,我之前用的编程语言是VB6.0,不是VBA,我不知道您到底有没有把我的问题看清楚,还是您自己不明白VB6.0和VBA的区别?或者这段回答是您的每个回答都如此复制粘贴水经验的?这是一个很基本但也很常见的应用场景,请回答具体问题。第三,博客园不仅是有水平的程序员,更加是普通编程爱好的交流学习的平台,如果没有水平回答我遇到的问题,就请不要回复了,别在这边秀优越感了,以您回答的语气和语言组织能力,想必您的编程水平也高不到哪里去,走好不送!

支持(0) 反对(1) DQYDXT | 园豆:152 (初学一级) | 2018-08-08 10:45

@DQYDXT: 哈哈,淡定,大牛说话就是这样的,我觉得他说的也挺对的。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-08-08 17:35

@会长: 这个论坛是博客园,不是知乎,我在这里是真心请教问题,寻求技术解决方案的,这么几楼,我还没有看到过技术性的解答,如果我要问怎么学习编程?从一门编程语言怎么转另一门?业余编程爱好者怎么学习编程?之类的问题,我大可以去微博,知乎,何必来博客园。。。而且我觉得我的问题很难回答么,还是我描述的不清楚?。。。。。还是谢谢     会长!

支持(0) 反对(1) DQYDXT | 园豆:152 (初学一级) | 2018-08-09 10:22

@DQYDXT: 其实我也被告人怼过,所以我问的问题标题都写着“高人误入”。我看了“爱编程的大叔”的答案,虽然语气有点高高在上,但是并没有明显的怼人。淡定了。

c#里同Math函数是最简单的方法了。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-08-09 10:57

@DQYDXT: 原来我这样的表达容易被当作秀优越感。

好吧,我换另外一种方式。

1. 我的意思很简单,有的工具就是要简单易用,就不希望你用复杂的编程方法,所以会使用一些复杂的编程方法不屑一用或者建议不用的,比如说大量的全局变量。

这不是优越感不优越感的问题,我自己也写VBA的,我很清楚简单易用的语言的好处和缺点。

简单的说,如果你在C#里面写几百个全局变量,早就被人打死了。语言本身没啥好歧视的,关键是看你用他来解决什么问题。

2. 比如说,在C#里面,几百个全局变量,可能如何处理呢,这个说起来太复杂了,没法再这儿细说,所以我本质上的建议就是,你必须深入学习,不要想在新手阶段就能问问解决问题。

比如,我可能把几百个变量按照不同的对象分拆成20个,放在对象中。

然后可以用Redis、文件、数据库等进行持久化。

再做个管理界面方便修改。

这在一般入门编程/业务人员那儿的感觉就是多此一举,脱裤子放屁。

但是作为希望重复利用,方便调试,给其他人用的来说,这就有必要了。

3. 就拿你这个为例,

最终包装好可以这么简单:

var c=s(a,b),

不知道这样是否比 c=a^2+b^2简单呢?

更复杂的,比如 c=log(a) + power(b,3)*sin^(x)可以写成

var c= myfun(a,b,x,....)

这样的答案你会满意吗?

 

说起来,为啥你没法得到满意的答案,

很简单啊,你问了一个需要一个编程老师教一个学期的问题。

然后希望别人三句话解释清楚。

 

问一个具体的问题,如何写一个什么样的SQL,很快就有人能答。

问一个泛泛的问题,如何写更好,如何处理异常,如何用C#,这...

 

问题越具体,越容易被很好的回答。

越不具体,最好的回答只能是你去看书吧。

支持(8) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2018-08-13 10:23
0

我怎么感觉你是在用面向对象的语言做着面向过程的编程呢。你的问题主要是觉得计算太复杂,如果把那个计算写成一个方法,每次调用这个方法不就行了。

会长 | 园豆:12401 (专家六级) | 2018-08-08 17:37

不是计算复杂,计算的本身不复杂,只不过是赋值公式的书写我觉得在C#中书写太繁琐,就是c=a^2+b^2要写成Common.c=Math.Pow(Common.a,2)+Math.Pow(Common.b,2),当然我的程序可以写下去,只是我询问是否有更好的处理方法。面向对象和面向过程编程的语言选择完全看用户需求啊,我现在肯定需要用户交互的,没有用户界面怎么进行人性化地输入输出呢,难道用C和Fortran?,那我如果纯粹要计算,直接用Matlab不是比什么都方便?何必用什么语言来编程写出程序。主要就是在C#中有没有更好的方法能够处理我遇到的这种场景呢

支持(0) 反对(0) DQYDXT | 园豆:152 (初学一级) | 2018-08-09 10:16

@DQYDXT: 据我所知,C#里没有比这种写法更简单的写法了。如果很多地方都用到同一个算法,那么把它写在一个方法里,实际上调用的时候也不限的复杂

支持(1) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-08-09 10:51
1

考虑扩展方法

既然变量公用,就把他们放在同一个类中

如class model中,

定义model的扩展方法,如c=a^2+b^2

首先定义平方:

1 static int Pow2(this int a)
2 {
3     return Math.Pow(a,2);
4 }

 

其次c=a^2+b^2:

1 static int Func1(this model m)
2 {
3   return m.a.Pow2()+m.b.Pow2();
4 }

调用Model的Func1方法即可。

Kisawik | 园豆:213 (菜鸟二级) | 2018-08-20 23:18
0

枚举.....感觉

pqp-z | 园豆:402 (菜鸟二级) | 2018-10-17 08:42
0

配合扩展方法的话大概是这样 V.c=V.a.Pow(2)+V.b.Pow(2)

以前处理复杂公式时用的是自己解析公式字符串,这个复杂了。。你还是按上边这样写吧,vs配合下不是很麻烦

前门后院 | 园豆:280 (菜鸟二级) | 2018-11-08 12:20
0

在C#,变量(字段/属性) 必须被 (类/结构)对象 包裹,所以你要么找出可复用的公式抽象成方法(函数)来调用,要么只能遵循C#的规则。

VAllen | 园豆:94 (初学一级) | 2018-11-16 09:32
0

静态类型了解一下 这是全局都可以访问的

四个春天 | 园豆:31 (初学一级) | 2019-02-15 10:37
0

放到配置文件中,既然是多个公共变量,访问的程序又很多,还是不要期望去改变他们的值,可以存放到XML供自己读取就行。

早服 | 园豆:208 (菜鸟二级) | 2019-05-24 09:01
0

声明一个公共类,用静态方法来做,如果要长久保存变量,建议用.ini文件读写的功能,简单实用,如果变量是成组的关联强,还可以声明成结构体(内存),这样单个变量读写、批量变量读写都可以简化。

sunyheart | 园豆:228 (菜鸟二级) | 2020-10-09 08:53
0

我就想问,你证书拿了几本

无名指的无 | 园豆:206 (菜鸟二级) | 2021-05-26 11:47
0

使用继承,默认的form窗体都继承Form ,你可以自定义一个FormMain继承Form ,然后再自己的Form里定义变量,然后所有继承这个FormMain 中使用this.变量就可以获取值

F12-爱码士 | 园豆:254 (菜鸟二级) | 2021-11-05 15:22
0

土木加编程?有搞头吗

编程非我意 | 园豆:220 (菜鸟二级) | 2022-08-30 17:58
0

将 所谓的公共变量 作为 静态类的字段,将公式计算,作为静态类的方法;调用时,直接调用公式方法。
缺点是:新增公式时,需要修改这个静态类。

internal class Program
{
	static void Main(string[] args)
	{
		Common.Nx = 1.2;
		Common.Ny = 9.0;

		double result = Common.复杂公式();
	}
}

public static class Common
{
	public static double Nx;
	public static double Ny;
	//公开其他字段:Nz,Vx,Vy,Vz,Mx,My,Mz

	//平方的和
	public static double 公式1()
	{
		return Nx * Nx + Ny * Ny;
	}

	//平方的差
	public static double 公式2()
	{
		return Nx * Nx - Ny * Ny;
	}

        public static double 复杂公式()
        {
            return 公式1() * 公式2();
        }
}
误会馋 | 园豆:242 (菜鸟二级) | 2023-01-17 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册