在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()等等。
在笔者的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>
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");
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];
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)}");
参数数组允许使用个数不定的参数调用函数,用params关键字定义。
static (, ..., params [] )
{
...
return ;
}
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();
}
}
}
public abstract class MyClass
{
//Class members, may be abstract
}
internal类可以继承public类,反之不可以。
指定基类与接口的方式:
public class MyBase
{
//Class members
}
public class MyClass : MyBase, IMyInterface, IMySecondInterface
{
//Class members.
}
支持该接口的类必须实现所有接口成员。
接口的定义:
interface IMyInterface
{
// Interface members.
}
接口可以用public 或者internal修饰,与类的效果相同
类库中只有类,没有入口点。类库项目编译为.dll程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容。