C# -写个简单的计算器(对象三要素与变量、数据类型)
效果
程序分析
-
需要三个TextBox 文本框,第一个和第二个 作为数字输入框,第三个作为结果显示框(并且设置属性ReadOnly 为 true 不可编辑)
-
需要一个 Combobox下拉框,编辑下拉选项里面输入 加减乘除 四个符号,并且在程序中初始化默认选中第一项
-
需要一个Button 按钮,添加点击事件,执行运算,并且将结果显示到第三个TextBox框中
-
修改主窗体名称为 简易计算器(在窗体属性中 修改 Text 属性值即可)
-
鼠标位置显示,需要两个label标签,第一个显示 鼠标位置 文案,第二个显示 鼠标坐标
-
鼠标位置显示: 选中窗体,在窗体的事件中找到MouseMove事件,双击该事件 自动生成方法
直接上代码
namespace 简单计算器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 设置下拉框默认选中第一项
comboBox1.SelectedIndex = 0;
}
private void button1_Click(object sender, EventArgs e)
{
// 获取运算符号
string f = comboBox1.Text.Trim();
//获取输入的数字
int num1 = Convert.ToInt32(textBox1.Text.Trim());
int num2 = Convert.ToInt32(textBox2.Text.Trim());
//计算
switch (f)
{
case "+":
textBox3.Text = (num1 + num2).ToString();
break;
case "-":
textBox3.Text = (num1 - num2).ToString();
break;
case "*":
textBox3.Text = (num1 * num2).ToString();
break;
case "/":
textBox3.Text = (num1 / num2).ToString();
break;
default:
textBox3.Text = "未知数";
break;
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// 显示鼠标位置
this.label3.Text =e.X +" , "+e.Y;
}
}
}
程序解析
- 对象三要素
- 属性(property)
- 如:上述案例中的 label3.Text、comboBox1.SelectedIndex等
- 方法(method)
- 如:上述中的 Convert.ToInt32()、 xxx.ToString()
- 事件(event)
- 如:上述中用到的 Click、MouseMove 等
- 事件的绑定方式
- 属性(property)
this.MouseMove+=new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
- 上述代码中的鼠标事件,winform已经自动帮助我们绑定了,可以在Designer.cs文件中查看
变量
- 程序的基本任务是对数据进行处理,数据则分为 变量(variable)与 常量( literal)
- 变量的值是可以改变的
- 上述的 string f、 int num1 这里面的 f、num1 都是变量
- 变量的命名
- 不能是c#关键字
- https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords
- 由字母、数字、下划线构成
- 第一个字符必须是字母或下划线
- 不要太长,一般不超过 31个字符为宜
- 变量名不要与库函数名、类名相同
- 如:name、_name、num 、countNum等,多个单词可用驼峰式命名,如:countNum、totalPage、listPerson等
- 注:c#是大小写敏感的
- 常量
- 常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变
- 常量使用 const 修饰符声明
- 仅 C# 内置类型(不包括 System.Object)可声明为 const。用户定义的类型(包括类、结构和数组)不能为 const
class Calendar1
{
// 在此示例中,常量 Weeks 始终为 12,即使类本身也无法更改它
public const int Weeks= 12;
}
class Calendar1
{
// 初始化常量的表达式可以引用另一个常量
public const int Weeks = 52;
public const int Days = 365;
public const double DaysPerWeek = (double) Days / (double) Weeks;
}
数据类型
注:每种简单数据类型都有一个关键词
- int 相当于 System.Int32
- double 相当于 System.Double
- bool 相当于 System.Boolean
- string 相当于 System.String
-(如果using System则 string相当于String)
namespace 简单计算器
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
test();
}
static void test()
{
//整型
byte a = 17;
int c = 123;
// 值后面需要加个 L
long c2 = 323L;
Console.WriteLine(a);
Console.WriteLine(c);
Console.WriteLine(c2);
//浮点型
double d = 12.3;
// 后面加个 m
decimal de = 2.1m;
// 值后面需要加个 F
float f = 3_000.5F;
Console.WriteLine(d + (double)de);
Console.WriteLine((decimal)a + de);
// 布尔型
bool check = true;
Console.WriteLine(check ? "Checked" : "Not checked");
//字符型
char ch = 'j';
// 可以直接写 unicode码
char ch2 = '\u006A';
Console.WriteLine(ch);
Console.WriteLine(ch2);
//枚举
Console.WriteLine(Season.Winter);
//结构
Coords coord=new Coords();
Console.WriteLine(coord);
//元组
(double, int) t = (4.5, 3);
Console.WriteLine(t.ToString());
// 类
Person person = new Person();
Console.WriteLine(person);
// 字符串 类型
String aa = "123";
Console.WriteLine(aa);
}
}
// 定义枚举
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
// 定义结构
public struct Coords
{
public Coords(double x, double y)
{
X = x;
Y = y;
}
public double X { get; }
public double Y { get; }
public override string ToString() => $"({X}, {Y})";
}
}
转义符
- \uxxxx 1到4位十六进制数所表示的字符
- \’ 单引号字符
- \" 双引号字符
- \\ 反斜杠字符
- \r 回车
- \n 换行
- \t 横行表格化
- \b 退格
字符串类型
- 字符串是引用类型,但对字符串常量有特殊处理
- 字符串前可使用 @,表示不进行转义
- 如:string url=@“”
static void test2()
{
// 前面加 @ 表示不用转义
string url = @"C:\Windows\System32";
Console.WriteLine(url);
// 默认情况下会转义,需要加转义符
string a = "C:\\Windows\\System32";
string b = "C:\\Windows\\System32 \r\n 你好";
string c = "C:\\Windows\\System32 \"你好\"";
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
}
扩展
- 推断类型(c# 3.0)
- var a=1+1; 推断是 整数
- 与javascript不同,其类型是由编译器推断,在编译时就确定了
- Nullable 类型(c# 3.0)
- int? a=32; 是否有值, 可以用 if(a.HasValue)来判断是否有值
- Dynamic(c#4.0) 由DLR支持
- dynamic x=new Cell();
- 编译时不检查,运行时才确定,主要用于与COM组件或其他语言交互