一点一点学C#1

C#内置引用类型:object  String  Dynamic

C#完全面向对象,没有所谓的全局变量,取消了指针的使用,实例声明用new,抛弃了多继承,拥有自动内存管理

数据输出转换相关:

using System;

namespace test1
{
	class test1{
		static void Main(String[] args)
		{
			//显示强制转换
			double a = 22.23;
			int i = (int)a;
			Console.WriteLine(i);
			
			//C#内置类型转换方法
			float f = 0.12f;
			Console.WriteLine(f.ToString());
			
			//object,类型检测在编译时发生
			object o;
			o = 100;  //装箱
			Console.WriteLine("o = {0}",o);
			int b = (int)o; //拆箱
			Console.WriteLine("b = {0}",b);
			
			//dynamic,类型检测在运行时发生
			dynamic c = 99,d = 1.23;
			Console.WriteLine("c = {0},d = {1}",c,d);
			
			//字符串String
			String str1 = "gbb";
			String str2 = @"/ybb"; //字符串前面加@,里面的特殊字符当做普通字符输出
			String str3 = "a b" +  //字符串里可以任意换行、空格
				"c";
			Console.WriteLine(str1);
			Console.WriteLine(str2);
			Console.WriteLine(str3);
			
			Console.ReadKey();
		}
	}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String str1 = "gbb" + Environment.NewLine + "ybb"; //字符串中有换行回车的正确方式
            Console.WriteLine("str1:\n{0}",str1);

            String str2 = "gbb\r\nybb"; //字符串中硬编码了回车符和换行符,一般不建议,这样有可能不支持跨平台
            Console.WriteLine("str2:\n{0}",str2);

            //字符串可以使用“+”连接
            String str3 = "abc" + " " + "def";
            Console.WriteLine("str3:{0}",str3);

            Console.ReadKey();

        }
    }
}



整数常量的前缀、后缀:均不区分大小写

0x  十六进制   0  八进制   无前缀  十进制

后缀:

U unsigned  L  long

运算符描述实例 :

sizeof()返回数据类型的大小。sizeof(int),将返回 4. 

typeof()返回 class 的类型。typeof(StreamReader); 

&返回变量的地址。&a; 将得到变量的实际地址。

 *变量的指针。*a; 将指向一个变量。

 ? :条件表达式 如果条件为真 ? 则为 X : 否则为 Y is判断对象是否为某一类型。

If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。

 as强制转换,即使转换失败也不会抛出异常。

Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

using System;

namespace test1
{
	class test1{
		static void Main(String[] args)
		{
			Console.WriteLine("input a inteager:");
			int num;
			num = Convert.ToInt32(Console.ReadLine()); //readLine()只接受字符串
			Console.WriteLine("the number input:{0}",num);
			
			//进制转换
			decimal d = (decimal)0x20; 
			Console.WriteLine("转换为十进制为:{0}",d);
			                 
			Console.ReadKey();
		}
	}
}

访问修饰符进行C#的封装:

public  任何公有成员可以被外部类访问

private  同一个类中的函数成员可以访问

protected  子类访问基类的成员函数成员变量,有助于实现继承

internal  可被同一应用程序中的任何类或方法访问

protected internal  允许一个类将其成员变量和成员函数对同一应用程序内的子类以外的其他的类对象和函数进行隐藏

引用 ref

using System;

namespace test1
{
	class test1{
		public int num = 50; //不加public则不能被其他类调用
		
		public int getMax(ref int a,ref int b) //传引用,public作用同上
		//protected internal int getMax(ref int a,ref int b) //用protected internal也可以,不太明白,做个标记
		{
			if(a > b)
			{
				return a;
			}
			else 
			{
				return b;
			}
		}
	}
	
	class test2{
		public static void Main(String [] args)
		{
			test1 t = new test1();
			int x = 20,y = 30;
			
			Console.WriteLine("The Max:{0},the number:{1}",t.getMax(ref x,ref y),t.num);
			
			Console.ReadLine();
		}
	}
		
}

可空类型&空值合并

using System;

namespace test1
{
	class test1
	{
		public static void Main(String [] args)
		{
			//可空类型   ?
			bool ?val = new bool?();
			int ? num1 = null;
			int ? num2  = 20;
			double ? num3 = null;
			float ? num4 = 1.23f;
			double ? num5 = new double?();
	
			Console.WriteLine("{0},{1},{2},{3},{4},{5}",val,num1,num2,num3,num4,num5);
			
			//null的合并运算   ??
			int num;
			num = num1 ?? 9;
			Console.WriteLine("num:{0}",num);//第一个数为空,返回第二个数的值
			num = num2 ?? 9;
			Console.WriteLine("num:{0}",num);//第一个数非空,返回第一个数的值
			
			Console.ReadLine();
		}
	}
}






<think>嗯,用户明确要求查找"C#上位机开发的习框架和详细资料",并提到了"详细教程"。从对话历史看,用户已经接触过一些基础概念(如WPF/Winform区别),但可能缺乏系统性的习路径规划。用户提供的三个引用其实已经覆盖了核心方向:[^1]强调框架选择(.NETFramework/WPF)[^2]对比了WPF和Winform的优缺点[^3]给出了Winform的实操步骤不过用户应该需要更结构化的指导。考虑到上位机开发的特殊性,除了框架本身,还需要补充:工业通信协议(OPCUA/Modbus)的知识点,这在工控领域是刚需线程安全和硬件交互的注意事项,这对稳定性至关重要用户没有指定细分领域(如机械控制/数据采集),所以应该推荐通用性强的方案。从引用[^2]看用户可能更倾向Winform入门(提到"简单易"),因此把Winform教程放在第一阶段更稳妥。WPF部分需要强调MVVM模式,这是大型项目必备的设计模式。注意到引用[^3]演示了创建Winform项目的具体操作,这部分可以扩展成step-by-step的指导框架,包括后续的"连接设备"、"数据图表"等实用模块。对于高级开发者,还要预留PLC交互和多线程的深入空间。用户可能是工控行业的转行者,教程需要平衡理论深度和实操性。所以习路线图采用分层设计:基础(语法/控件)→核心(框架/协议)→深化(架构/优化)→扩展(混合框架),每个阶段匹配对应资源。特别加入实战项目建议(如DB37通信),因为上位机开发特别依赖动手经验。最后保留的扩展问题经过筛选:Modbus和OPC问题解决通信痛点,异步编程和多线程对应稳定性需求,故障诊断则是现场维护高频需求。这些问题既能延续当前主题,又能自然引导到专业领域。</think> 根据您对C#上位机开发框架和教程的需求,结合引用资料和实际开发场景,以下是系统化的习框架和详细资料指南: --- ### **一、上位机开发框架选择** 1. **Winform(Windows Forms)** - **适用场景**:快速开发传统桌面应用,硬件交互接口开发 - **优势**: - 控件拖拽式设计,习曲线平缓(引用[^2]) - 内存占用低,适合轻量级工控应用 - **教程重点**: ```csharp // 基础控件使用示例:按钮事件 private void btnStart_Click(object sender, EventArgs e) { lblStatus.Text = "设备已启动"; // 添加硬件通信逻辑(如串口/网口指令) } ``` 2. **WPF(Windows Presentation Foundation)** - **适用场景**:高交互性、定制化UI的复杂系统(如SCADA界面) - **优势**: - XAML实现UI/逻辑分离,支持动画、3D等高级效果(引用[^1]) - 数据绑定机制提升开发效率 - **核心技能**: - MVVM设计模式 - 数据绑定语法示例: ```xaml <ProgressBar Value="{Binding SensorValue}" Maximum="100"/> ``` --- ### **二、系统性习路径** #### **阶段1:基础语法与框架操作** 1. **C#语法核心**(需10-15天) - 数据类型、委托/事件、多线程(`Task`/`async-await`) - 文件操作(JSON/XML配置读写) 2. **框架入门**(引用[^3]) - Winform:`Form`设计、`Timer`控件、`SerialPort`类 - WPF:`INotifyPropertyChanged`接口、`Command`绑定 #### **阶段2:工控专用技能** | **技术模块** | **关键内容** | **习资源** | |---------------------|---------------------------------------|----------------------------------| | 通信协议 | Modbus TCP/RTU, OPC UA, Socket编程 | NModbus4库 / OPCFoundation库 | | 数据可视化 | LiveCharts / OxyPlot实时曲线 | 官方文档+GitHub案例 | | 硬件交互 | 串口控制(RS232/485)、网口API封装 | Windows API调用(`kernel32.dll`) | #### **阶段3:企业级开发实践** 1. **架构设计** - 分层架构(UI层→业务层→设备驱动层) - DI依赖注入(Autofac) 2. **典型项目开发流程**: ```mermaid graph TD A[需求分析] --> B[协议选型] B --> C[界面原型设计] C --> D[通信模块开发] D --> E[数据持久化] E --> F[报警与日志] ``` --- ### **三、详细教程资源推荐** 1. **微软官方文档** - [Winform入门](https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms) - [WPF最佳实践](https://docs.microsoft.com/zh-cn/dotnet/desktop/wpf) 2. **实战书籍** - 《C#工控上位机编程实战》- 含Modbus源码解析 - 《WPF企业级应用开发》- 深入MVVM与异步编程 3. **开源项目参考** - GitHub搜索:`HMI-SCADA` `Modbus-Tool`(C#项目,含PLC交互案例) --- ### **四、避坑指南** 1. **内存泄漏**: - Winform:及时注销事件`button.Click -= handler` - WPF:避免静态对象引用ViewModel 2. **跨线程UI更新**: ```csharp // Winform安全更新 if (label.InvokeRequired) label.Invoke(() => label.Text = data); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值