各位大神好,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上也发了帖子求教,但是感觉没有得到良好的答案,真心求教博客园的各位大神!因为是新手,几乎没什么园豆,大家见谅,谢谢大家!
关键字static 或者传 引用(class就是引用,非引用类型可以通过ref),其他共享内存,文件....
公式复杂就分步计算啊,如y=a*2+b*2,你可以先算a*2啊之类,或者把某个公式定义成函数啊,函数内部变量名称总简单了吧,实在不行就复杂点也没问题,注意排版就行
这....
我的建议是,如果你一直要定位自己是编程新手的话,还是别折腾了。
1.工具本身就有偏向性,不是说月强大的工具就对你越好用,强大有时候意味着选择太多,需要你去定制出适合自己的东西,然而你并不是能定制的人。
2. 换语言有时候很容易,2小时就能学会一个语言的基本语法。但是出问题的往往是语言的思路,理念,VBA是微软打造的专门用于应用软件增强功能的脚本级语言,如果你要用C#,本身就需要做更多的工作才能适配。
3、有的语言是给End user用的(比如你,比如VBA),有的语言是给软件开发人员开发软件给End User用的,这就要求你不是编程小白了(比如C#)。
4. 你的主要应用是数据计算,我就拿Excel 里面的Add-in为例说明吧,Excel里面有用于统计的第三方工具集,这就是专业的编程人员开发出来给你用的,而如果你自己编写,不深入学习编程理论和语言的话,当然只能使用简单的VBA做一些简单的使用大量全局变量的简单函数了。
第一,我是给自己的定为是C#新手,不是编程新手,我的技术水平已经能够用VB独立设计具有交互界面,计算功能,自动出报表的结构计算程序了;对于编程大牛来说还不入流,但对于我个人的工作已经足够,不知道您是哪来的优越感?。第二,我之前用的编程语言是VB6.0,不是VBA,我不知道您到底有没有把我的问题看清楚,还是您自己不明白VB6.0和VBA的区别?或者这段回答是您的每个回答都如此复制粘贴水经验的?这是一个很基本但也很常见的应用场景,请回答具体问题。第三,博客园不仅是有水平的程序员,更加是普通编程爱好的交流学习的平台,如果没有水平回答我遇到的问题,就请不要回复了,别在这边秀优越感了,以您回答的语气和语言组织能力,想必您的编程水平也高不到哪里去,走好不送!
@DQYDXT: 哈哈,淡定,大牛说话就是这样的,我觉得他说的也挺对的。
@会长: 这个论坛是博客园,不是知乎,我在这里是真心请教问题,寻求技术解决方案的,这么几楼,我还没有看到过技术性的解答,如果我要问怎么学习编程?从一门编程语言怎么转另一门?业余编程爱好者怎么学习编程?之类的问题,我大可以去微博,知乎,何必来博客园。。。而且我觉得我的问题很难回答么,还是我描述的不清楚?。。。。。还是谢谢 会长!
@DQYDXT: 其实我也被告人怼过,所以我问的问题标题都写着“高人误入”。我看了“爱编程的大叔”的答案,虽然语气有点高高在上,但是并没有明显的怼人。淡定了。
c#里同Math函数是最简单的方法了。
@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#,这...
问题越具体,越容易被很好的回答。
越不具体,最好的回答只能是你去看书吧。
我怎么感觉你是在用面向对象的语言做着面向过程的编程呢。你的问题主要是觉得计算太复杂,如果把那个计算写成一个方法,每次调用这个方法不就行了。
不是计算复杂,计算的本身不复杂,只不过是赋值公式的书写我觉得在C#中书写太繁琐,就是c=a^2+b^2要写成Common.c=Math.Pow(Common.a,2)+Math.Pow(Common.b,2),当然我的程序可以写下去,只是我询问是否有更好的处理方法。面向对象和面向过程编程的语言选择完全看用户需求啊,我现在肯定需要用户交互的,没有用户界面怎么进行人性化地输入输出呢,难道用C和Fortran?,那我如果纯粹要计算,直接用Matlab不是比什么都方便?何必用什么语言来编程写出程序。主要就是在C#中有没有更好的方法能够处理我遇到的这种场景呢
@DQYDXT: 据我所知,C#里没有比这种写法更简单的写法了。如果很多地方都用到同一个算法,那么把它写在一个方法里,实际上调用的时候也不限的复杂
考虑扩展方法
既然变量公用,就把他们放在同一个类中
如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方法即可。
枚举.....感觉
配合扩展方法的话大概是这样 V.c=V.a.Pow(2)+V.b.Pow(2)
以前处理复杂公式时用的是自己解析公式字符串,这个复杂了。。你还是按上边这样写吧,vs配合下不是很麻烦
在C#,变量(字段/属性) 必须被 (类/结构)对象 包裹,所以你要么找出可复用的公式抽象成方法(函数)来调用,要么只能遵循C#的规则。
静态类型了解一下 这是全局都可以访问的
放到配置文件中,既然是多个公共变量,访问的程序又很多,还是不要期望去改变他们的值,可以存放到XML供自己读取就行。
声明一个公共类,用静态方法来做,如果要长久保存变量,建议用.ini文件读写的功能,简单实用,如果变量是成组的关联强,还可以声明成结构体(内存),这样单个变量读写、批量变量读写都可以简化。
我就想问,你证书拿了几本
使用继承,默认的form窗体都继承Form ,你可以自定义一个FormMain继承Form ,然后再自己的Form里定义变量,然后所有继承这个FormMain 中使用this.变量就可以获取值
土木加编程?有搞头吗
将 所谓的公共变量 作为 静态类的字段,将公式计算,作为静态类的方法;调用时,直接调用公式方法。
缺点是:新增公式时,需要修改这个静态类。
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();
}
}
VB 代码是可以翻译成c# 代码的 ,有在线翻译,你可以试试
– pengbg 6年前你可以加一些QQ 群,之前发视频让别人远程教你,如果我现在不忙的话,之前就远程你了
– pengbg 6年前我也觉得公共变量的话,放在一个类里边会好一点
– 闲云渐适 1年前