C#入门快速学习笔记1(有C++基础)

1 使用VS创建基本的程序

1.1 创建控制台应用程序

在VS中新建项目Visual C#的控制台应用即可,笔者所用的VS2017中的目录为:Visual C# / Windows 经典桌面 / 控制台应用(.NET Framework)。
一个超简短的控制台输出程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("This is the first ConsoleApp");
        }
    }
}

其他可以使用的Console类方法还有ReadLine(), Readkey()等等。

1.2 利用WPF(Windows Presentation Foundation)创建桌面应用程序

在笔者的VS2017中,创建新项目的目录为:Visual C# / Windows 经典桌面 / WPF应用(.NET Framework)
在.cs文件中写逻辑,在.xaml文件中设计界面控件。在设计界面时,工具箱(ToolBox)中有需要的控件。控件可以在XAML代码中精确地控制。
最简单的示例代码:

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 WpfApp2
{
    /// 
    /// MainWindow.xaml 的交互逻辑
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        //此处为点击Button的响应函数
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("You have clicked the Button");
        }
    }
}

以下是窗口的xaml文件

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="324,196,0,0" VerticalAlignment="Top" Width="120" Height="42" Click="Button_Click"/>

    Grid>
Window>

2 C#相比C++的新语法

2.1 数据类型

  • 增加了byte, sbyte类型(8 bit)
  • char型为Unicode字符,存储0和65535之间的整数。
  • 增加了decimal类型表示实数
  • 数据类型转换时,有关溢出检查(如long转化成int),可以用到两个关键字——checked和unchecked。 用法为:
    checked(<expression>)
    unchecked(<expression>)
    如果使用checked,执行程序时会做出检查;unchecked则不然。
  • 可以使用Convert命令进行显式转换,如Convert.ToDouble(1)
  • 枚举类型有所不同,示例:
enum orientation : byte
{
    north = 1,
    south = 2,
    east = 3, 
    west = 4
}

当输出枚举类型时,与C++不同,输出的结果是字符串north等等。string和枚举值可以相互转换:

orientation myDirection1 = orientation.north;
string directionString = myDirection1.ToString();
orientation myDirection2 = (orientation)Enum.Parse(typeof(orientation), "north");
  • 结构体的使用和C++没有明显的区别
  • 数组示例代码:
int[] myIntArray = { 5, 9, 10, 2 };
int[] myArray = new int[arraySize];
foreach(int  in myIntArray)
{
    //can use  for each element 
}

//多维数组
double[,] hillheight = new double[3,4];

//数组的数组
int[][] jaggedIntArray;
jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];

2.2 引用ref和输出参数out

C#中引用的使用和C++中有所不同,使用ref关键字,实参也需要用ref修饰:

static void ShowDouble(ref int val)
{
    val *= 2;
    //使用$与{}可以达到C语言中%d与参数的关系
    WriteLine($"val doubled = {val}");
}

int Number = 5;
ShowDouble(ref Number);

为了更加方便传值,C#中还可以使用out关键字,与引用参数多有类似之处,重要区别在于:
未赋值的参数可以用作out参数;在函数使用out参数时,必须把它看作尚未赋值,必须在函数体中进行赋值。

static void MaxValue(int[] intArray, out int maxIndex)
{
    int maxVal = intArray[0];
    maxIndex = 0; 
    for(int i = 1; i < intArray.Length; i++)
    {
        if(intArray[i] > maxVal)
        {
            maxVal = intArray[i];
            maxIndex = i;
        }
    }
    return maxVal;
}

int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
int maxIndex;
WriteLine($"The maximum value in myArray is {MaxValue(myArray, out maxIndex)}");

2.3 参数数组

参数数组允许使用个数不定的参数调用函数,用params关键字定义。

static  (, ..., params [] )
{
    ...
    return ;
}

2.4 委托delegate

delegate是一种存储函数引用的类型,与C语言中的函数指针有相似之处。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Convert;
//通过 using static 包含静态类Console等

namespace ConsoleApp1
{
    class Program
    {
        delegate double ProcessDelegate(double param1, double param2);//定义委托类型
        static double Multiply(double param1, double param2) => param1 * param2;//使用lambda函数
        static double Divide(double param1, double param2) => param1 / param2;

        static void Main(string[] args)
        {
            ProcessDelegate process;
            WriteLine("Enter 2 numbers seperated with a comma:");
            string input = ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = ToDouble(input.Substring(0, commaPos));
            double param2 = ToDouble(input.Substring(commaPos + 1,
                input.Length - commaPos - 1));
            WriteLine("Enter M to multiply or D to divide:");
            input = ReadLine();
            if (input == "M")
            {
                process = new ProcessDelegate(Multiply);
            }
            else
            {
                process = new ProcessDelegate(Divide);
            }
            WriteLine($"Result : {process(param1, param2)}");
            ReadKey();
        }
    }
}

3 OOP

3.1 修饰类的几个关键字

  • internal : 只有当前项目中的代码能访问(默认)
  • public : 可由其他项目的代码访问
  • abstract : 不能实例化,只能继承
  • sealed : 不能继承
public abstract class MyClass
{
    //Class members, may be abstract
}

internal类可以继承public类,反之不可以。

3.2 接口interface

指定基类与接口的方式:

public class MyBase
{
    //Class members
}

public class MyClass : MyBase, IMyInterface, IMySecondInterface
{
    //Class members.
}

支持该接口的类必须实现所有接口成员。
接口的定义:

interface IMyInterface
{
    // Interface members.
}

接口可以用public 或者internal修饰,与类的效果相同

3.3 类库

类库中只有类,没有入口点。类库项目编译为.dll程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容。

你可能感兴趣的:(C++,Python,Machine,Learning)