C#复习

C#复习 2021-6-15-Tue @201900800149 朱胤璘


1. 代码组织结构

1.1 解决方案组织

以解决方案2019000800149朱胤璘为例,一个解决方案内可以有多个子项目:

## 201900800149朱胤璘
#---- MyConsoleApp
#---- MyWpfApp

1.2 项目内部组织

创建一个项目,同时会生成一个同名的命名空间

例如创建一个MyConsoleApp项目(控制台应用程序),打开默认生成的Program.cs文件,该文件内容如下

namespace MyConsoleApp // 项目名
{
    class Program // 类名
    {
        public static void Main(string[] args)
        {
            // ...
        }
    }
}

在项目中你还可以创建文件夹,并在文件夹内创建类。这么做会创建子命名空间。事实上,C#的命名空间可以等同于Java的包理解。

image-20210615180529487
namespace MyConsoleApp.A01 // 创建子级别命名空间
{
    class A01个人信息
    {
        public A01个人信息()
        {
            Console.WriteLine("班级:19计合03");
            Console.WriteLine("学号:201900800149");
            Console.WriteLine("姓名:朱胤璘");
        }
    }
}

1.3 WPF结构

image-20210615181301690
  • 文件夹内部存放不同的分类的文件
  • 资源文件、引用文件单独建文件夹
  • App.xaml, App.xaml.cs 会设置启动界面为MainWindow.xaml
  • MainWindow.xaml, MainWindow.xaml.cs 主窗口及其逻辑实现

.xaml文件:使用xaml标记描述界面

.xaml.cs文件:界面实现

1.4 命名习惯

  • 类名、方法名、属性名:各个单词首字母大写
  • 变量名,方法参数:第一个单词小写,其余单词首字母大写

2. Console

2.1 字符串格式化输出

int x = 10, y = 20, z = 30;
Console.WriteLine("{3} = {1} + {2} + {0}", x, y, z, x+y+z);

2.2 字符串格式化表示(P73)

  • 法1
int i = 123;
string s = string.Format("{0:d6}",i);
  • 法2(ppt P6)
int i = 123;
double j = 123.45;
string s1 = $"i:d6"; // "000123"
string s2 = $"i:{i,-7},j:{j,7}"; // "i:    123,j:123.45 "

3. Wpf

partial class

生成一个WPF项目,系统会自动添加App类,是应用程序的入口,同时指定了起始界面窗口

namespace testApp
{
    public partial class App : Application // partial 部分类
    {
        // ...
    }
}

3.1 Xaml

  • Xaml中的空白字符包括:空格、换行符、制表符
  • Xaml处理器默认将所有的空白符自动转化为空格
  • 连续的空格将被替换为一个空格
  • 如果希望保留文本字符串中的空格,可以在该元素的开始标记内添加 xml:space = "preserve" 特性。

3.1.1 xaml 转义


 // 换行
  // 空格
	 // Tab

 // 回车

3.2 Window 和 Page(P26)

  • WPF窗口:继承了Window类,用于显示WPF元素,是主要使用的界面。
Window x;
// 常用方法
x.Hide();
x.Close();
x.Show();

// 窗口属性
Width, MinWidth, MaxWidth, Height, MinHeight, MaxHeight, SizeToContent
WindowStartupLocation( [Manual, CenterScreen, CenterOwner] 
  • WPF页:继承了Page类,需要窗口来承载

4. 界面设计

4.1 Panel 面板

组织控件的一种风格。如StackPanel,WrapPanel

4.2 GroupBox 分组框

image-20210615205355103

包含一个标题

  • Header:设置或获取GroupBox的标题

和内容

  • Content:可以嵌套其他容器

4.3 Border 边框

Border用于在某个元素周围绘制边框,或者为某元素提供背景。

4.4 TextBlock 与 TextBox 与 Label

一个只读文本,一个可写, 一个可显示图片(?)

  • TextBox MaxLength

4.5 Button 按钮

image-20210615210015494
btn2.Click += delegate
{
    fontSizeIndex--;
    ShowState();
    btn1.IsEnabled = true;
    if (fontSizeIndex == 0)
    {
        btn2.IsEnabled = false;
    }
};

4.6 MessageBox 消息框

MessageBox.Show("请选择一个.txt文件", "系统消息");

4.7 PasswordBox 密码框

PasswordBox a = new PasswordBox();
a.PasswordChar = '*';
a.Password = "123";

4.8 Color 颜色

Color color = Color.FromArgb(255, rgb[0], rgb[1], rgb[2]);
Color x = Color.Red;

4.9 RadioButton 单选按钮

image-20210615220534999

4.10 CheckBox 复选框

image-20210615220604042 image-20210615220859248

4.10 ListBox 和 ComboBox

image-20210615220950229 image-20210615221010899 image-20210615221025900

5. 数据类型

5.1 枚举

枚举的所有常量值必须为统一类型

image-20210615212422198

5.2 可空

int? age = 0;
int? n = null;
double? d = 4.108;
bool? isFlag = false;	

5.3 类型转换

image-20210615212758242

5.4 流程控制语句

for
while
do-while
    
foreach
// demo
foreach(var x in 表达式){
    // ...
}

6. 面向对象 & 类

6.1 静态构造与实例构造

image-20210615213727761

image-20210615213827992

6.2 this 关键字:与Java用法一致

6.3 ref引用和out引用

image-20210615213928338
class Program
{
    public static void MyMethod(out int a, out int b)
    {
        a = 5;    
        b = 6;   
    }    //函数中赋值
    static void Main() 
    {
        int x, y;
        MyMethod( out x,  out y );  //引用时无初值
        Console.WriteLine ("调用MyMethod后,x={0},y={1}", x, y);
        Console.ReadLine();        
    }
}

6.4 参数数组

image-20210615214141644

6.5 匿名方法与Lambda表达式

https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/lambda-expressions

6.6 属性与事件

https://www.cnblogs.com/popodynasty/p/14838479.html

7. 数据流与文本文件读写

https://www.cnblogs.com/popodynasty/p/14868925.html

8. LINQ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MyWpfApp.A05
{
    /// <summary>
    /// LINQ.xaml 的交互逻辑
    /// </summary>
    public partial class LINQ : Page
    {

        class Student
        {
            static int count = 0;
            public int Id { set; get; }
            public string Name { set; get; }
            public string Gender { set; get; }

            public int Score{ set; get; }

        }
        public LINQ()
        {
            InitializeComponent();

            List<Student> students = new List<Student>()
            {
                new Student{Id = 1, Name="张三",Gender="男", Score=81},
                new Student{Id = 2, Name="李四",Gender="男",Score=83 },
                new Student{Id = 3, Name="李五",Gender="女",Score=85},
                new Student{Id = 4, Name="王六",Gender="男",Score=83}
            };

            var Result = from x in students orderby x.Score ascending, x.Name ascending where x.Score > 0 group x by x.Gender;

            StringBuilder sb = new StringBuilder();

            Tb.Text += "学号" + "	" + "姓名" + "	" + "性别" + "	" + "成绩" + "
";

            foreach (var ThisGender in Result)
            {
                foreach(var stu in ThisGender)
                {
                    Tb.Text += stu.Id + "	" + stu.Name + "	" + stu.Gender + "	" + stu.Score + "
";
                }
            }
        }
    }
}

9. 画布

https://www.cnblogs.com/chillsrc/p/4539947.html

Canvas是最基本的面板,只是一个存储控件的容器,它不会自动调整内部元素的排列及大小,它仅支持用显式坐标定位控件,它也允许指定相对任何角的坐标,而不仅仅是左上角。可以使用Left、Top、Right、 Bottom附加属性在Canvas中定位控件。通过设置Left和Right属性的值表示元素最靠近的那条边,应该与Canvas左边缘或右边缘保持一个固定的距离,设置Top和Bottom的值也是类似的意思。实质上,你在选择每个控件停靠的角时,附加属性的值是作为外边距使用的。如果一个控件没有使 用任何附加属性,它会被放在Canvas的左上方(等同于设置Left和Top为0)。

Canvas的主要用途是用来画图。Canvas默认不会自动裁减超过自身范围的内容,即溢出的内容会显示在Canvas外面,这是因为默认 ClipToBounds=”False”;我们可以通过设置ClipToBounds=”True”来裁剪多出的内容。

最后 要说明一点Canvas内的子控件不能使用两个以上的Canvas附加属性,如果同时设置Canvas.Left和Canvas.Right属性,那么后者将会被忽略。

---- suffer now and live the rest of your life as a champion ----
原文地址:https://www.cnblogs.com/popodynasty/p/14887424.html