更新记录
转载请注明出处:
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());
标签:教程,Console,Enum,System,实例,WriteLine,类型,NET,public
From: https://www.cnblogs.com/cqpanda/p/16730775.html