重庆熊猫 Loading

.NET教程 - 基础类型

更新记录
转载请注明出处:
2022年9月27日 发布。
2022年9月26日 从笔记迁移到博客。

System.Object

System.Object主要成员

public class Object
{
    //构造函数
    public Object();
    //析构器
    protected virtual void Finalize();
    //获得类型
    public extern Type GetType();
    //获得Hash值
    public virtual int GetHashCode();
    //比较相等
    public virtual bool Equals (object obj);
    //转为字符串
    public virtual string ToString();
    //成员复制
    protected extern object MemberwiseClone();
    //比较相等(静态)
    public static bool Equals (object objA, object objB);
    //比较引用相等(静态)
    public static bool ReferenceEquals (object objA, object objB);
}

Equals, ReferenceEquals, and GetHashCode方法

说明

overriding Equals()时记得override GetHashCode()

当把类型用在HashTable和Dictionary<T,T>中时,记得重写GetHashCode()

重写GetHashCode()最佳实践

必须保证:相等的对象必须有相等的hash codes

如果a.Equals(b)则必须a.GetHashCode() == b.GetHashCode()

必须保证:GetHashCode()的返回值不会受到对象状态的影响

必须保证:GetHashCode()不可以抛出任何异常,该方法必须执行成功

性能:Hash codes必须是唯一的

性能:GetHashCode() should be optimized for performance

Equals和==的差异

==使用ReferenceEquals

实例:

object x = 3;
object y = 3;
Console.WriteLine (x == y);        // False
Console.WriteLine (x.Equals (y));  // True

GetHashCode

GetHashCode 主要用于基于哈希表的字典(hashtable-based dictionaries)

比如:System.Collections.Generic.Dictionary 和 System.Collections.Hashtable

实例:

public override int GetHashCode() => =>
                    HashCode.Combine(
                        Longitude.GetHashCode(),
                        Latitude.GetHashCode());

ToString()方法

public virtual string ToString();

注意:如果没有override ToString,默认返回类型名称

可以在子类中重写ToString()方法

最佳实践

可以返回有用的面向开发人员的诊断字符串时,记得重写ToString方法

重写ToString方法不要返回空字符串/NULL,返回简短的信息即可

不要在ToString方法中抛出异常和修改对象的状态

需要支持多种文化可以考虑使用IFormattable接口

实例:override ToString

public class Panda
{
    public string Name;
    //override结合方法体
    public override string ToString() => Name;
}
//使用
Panda p = new Panda { Name = "Petey" };
Console.WriteLine (p); // Petey

GetType()方法

获得用户类型注意

Object.GetType()方法   在运行时计算
typeof()运算            在编译时静态计算

当涉及泛型类型参数时由JIT编译器解析

实例:GetType获得类型信息

using System;
namespace ConsoleApp2
{
    public class Point { public int X, Y; }

    class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point();
            Console.WriteLine(p.GetType().Name); // Point
            Console.WriteLine(typeof(Point).Name); // Point
            Console.WriteLine(p.GetType() == typeof(Point)); // True
            Console.WriteLine(p.X.GetType().Name); // Int32
            Console.WriteLine(p.Y.GetType().FullName); // System.Int32

            //wait
            Console.ReadKey();
        }
    }
}

System.Console

Console作用

The static Console class handles standard input/output for console-based applications

the input comes from the keyboard via Read、ReadLine、ReadKey

the output goes to the text window via Write、WriteLine

control the window’s position and dimensions with the properties WindowLeft、WindowTop、WindowHeight、WindowWidth

change the BackgroundColor and ForegroundColor properties

manipulate the cursor with the CursorLeft, CursorTop, and CursorSize properties

实例:设置控制台窗口的Title标题

Console.Title = "Panda Test";

实例:设置控制台窗口的宽度

Console.WindowWidth = Console.LargestWindowWidth;

实例:设置背景色和前景色

Console.ForegroundColor = ConsoleColor.Green;
Console.BackgroundColor = ConsoleColor.Red;

实例:设置输出到文本中,而不是控制台

System.IO.TextWriter oldOut = Console.Out;
// Redirect the console's output to a file:
using (System.IO.TextWriter w = System.IO.File.CreateText("e:\\output.txt"))
{
    Console.SetOut(w);
    Console.WriteLine("Hello world");
}
// Restore standard console output
Console.SetOut(oldOut);

实例:读取命令行的一个字符

注意:需要转为char后再使用

char userInputChar = (char)Console.Read();
Console.WriteLine(userInputChar);

实例:读取命令行的一行字符串

string userInputString = Console.ReadLine();
Console.WriteLine(userInputString);

实例:读取用户按下的按键

ConsoleKeyInfo userInputKey = Console.ReadKey();

if(userInputKey.Key == ConsoleKey.Enter)
{
    Console.WriteLine(userInputKey.KeyChar);
}

或者

if ((Console.ReadKey()).Key == ConsoleKey.Enter)
{
    //Do Something
}

监听键盘方向键

while (true)
{
    switch (Console.ReadKey().Key)
    {
        case ConsoleKey.UpArrow:
            Console.WriteLine("UpArrow");
            break;
        case ConsoleKey.DownArrow:
            Console.WriteLine("DownArrow");
            break;
        case ConsoleKey.LeftArrow:
            Console.WriteLine("LeftArrow");
            break;
        case ConsoleKey.RightArrow:
            Console.WriteLine("RightArrow");
            break;
    }
}

输出铺满整个Console行的*号

string stars = "*".PadRight(Console.WindowWidth - 1, '*');
Console.WriteLine(stars);

System.Environment

Environment提供的主要功能

Files and folders: CurrentDirectory, SystemDirectory, CommandLine

Computer and operating system: MachineName, ProcessorCount, OSVersion, NewLine

User logon: UserName, UserInteractive, UserDomainName

Diagnostics: TickCount, StackTrace, WorkingSet, Version

set/access OS environment variables:

使用下列三个方法:

GetEnvironmentVariable

GetEnvironmentVariables

SetEnvironmentVariable

实例:目录和文件相关

实例:获得当前所在目录

Console.WriteLine(Environment.CurrentDirectory);

实例:获得System所在目录

C:\Windows\system32

Console.WriteLine(Environment.SystemDirectory);

实例:输出命令行的内容(参数和参数值)

使用Environment.CommandLine属性

注意:结果中包含程序名称

//输入内容
// ./ ConsoleApp1.exe - arg1 value1 - arg2 value2
//输出内容
//arg1 = value1
//arg2 = value2

代码:

//直接输出全部内容
Console.WriteLine(Environment.CommandLine);

//将参数和参数值分割出来
string[] userCommandArgs = Environment.CommandLine.Split(' ');
//跳过第1个值(程序名称)
for (int i = 1; i < userCommandArgs.Length-1; i+=2)
{
    //跳过-符号
    Console.WriteLine($"{userCommandArgs[i].Substring(1)} = {userCommandArgs[i+1]}");
}

实例:获得系统和计算机信息

实例:判断是否64位操作系统

Console.WriteLine(Environment.Is64BitOperatingSystem);

实例:判断是否支持64位的处理器

Console.WriteLine(Environment.Is64BitProcess);

实例:获得计算机名称

Console.WriteLine(Environment.MachineName); //WINDOWSSERVER

实例:获得处理器核心数量

Console.WriteLine(Environment.ProcessorCount); //4

实例:获得操作系统版本信息

Console.WriteLine(Environment.OSVersion); 
//Microsoft Windows NT 6.2.9200.0

实例:新行(跨平台)

Console.WriteLine(Environment.NewLine);

实例:用户信息

实例:获得当前用户的用户名

Console.WriteLine(Environment.UserName); //Administrator

实例:获得当前用户的域用户名

Console.WriteLine(Environment.UserDomainName);

System.AppContext

说明

AppContext是一个静态类型

实用成员:

BaseDirectory 应用启动的目录地址

TargetFrameworkName 框架的名称和版本

实例:获得应用启动的目录地址

Console.WriteLine(AppContext.BaseDirectory);

实例:框架的名称和版本

Console.WriteLine(AppContext.TargetFrameworkName);

System.Enum

作用

Providing type unification for all enum types

Defining static utility methods

实例:具体Enum类型转为System.Enum类型

enum Size { Small, Medium, Large }
System.Enum val = Size.Large;
Console.WriteLine(val.GetType().FullName); //ConsoleApp3.Size
Console.WriteLine(val.ToString()); //Large

枚举类型转换(Enum Conversions)

There are three ways to represent an enum value:

As an enum member

As its underlying integral value

As a string

枚举类型转为整数类型(Enum-to-integral conversions)

使用强制转换

实例:

[Flags]
public enum BorderSides { Left = 1, Right = 2, Top = 4, Bottom = 8 }
int i = (int) BorderSides.Top; // i == 4
BorderSides side = (BorderSides) i; // side == BorderSides.Top

实例:获得Enum具体类型的底层整数类型

enum Size { Small, Medium, Large }
Enum.GetUnderlyingType(typeof(Size)).Name

整数类型转为枚举类型(Integral-to-enum conversions)

直接使用强制转换即可

本质是转为Object类型后再转为Enum类型

实例:

enum Size { Small, Medium, Large }
Size result = (Size)2;
Console.WriteLine(result); //Large

字符串类型转为枚举类型(String conversions)

使用Enum.Parse静态方法

实例:

enum Size { Small, Medium, Large }
Size result = (Size)Enum.Parse(typeof(Size), "Large");
Console.WriteLine(result); //Large

枚举Enum的成员(Enumerating Enum Values)

使用Enum类型的GetNames静态方法获得具体Enum值的名称

使用Enum类型的GetValues静态方法获得具体Enum值

实例:获得具体Enum值

enum Size { Small, Medium, Large }
foreach (Enum item in Enum.GetValues(typeof(Size)))
{
    Console.WriteLine(item);
    Console.WriteLine((int)(object)item);
}

实例:获得具体Enum值的名称

enum Size { Small, Medium, Large }
foreach (string item in Enum.GetNames(typeof(Size)))
{
    Console.WriteLine(item);
}

Enum本质

在编译器内部定义的枚举类型都被转为System.Enum类型的子类
而枚举值转为子类的成员
当引用子类的成员方法时会进行一次装箱操作

System.Guid

Guid结构(Guid Struct)

实例:生成Guid

Guid g = Guid.NewGuid();
Console.WriteLine(g.ToString());
posted @ 2022-09-27 08:29  重庆熊猫  阅读(159)  评论(0编辑  收藏  举报