首页 > 编程语言 >C#教程 - 其他(Other)

C#教程 - 其他(Other)

时间:2022-09-25 13:56:44浏览次数:86  
标签:教程 Console C# object Equals Note other Other public

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

== 和 Equals()区别

如果是引用类型,==运算符比较的是引用的对象是否指向同一个内存区域。 而Equals() 方法检查的是值是否相等。

Convert.ToString()和ToString()区别

Convert.ToString()和ToString()的区别是前者可以处理Null值,后者不可以。

获取控制台应用命令行参数

方法一:使用Main方法的参数

static void Main(string[] args)
{
    foreach (string arg in args)
    {
        Console.WriteLine(arg);
    }
    
    Console.ReadKey();
}

注意:这种方法获得的参数不包含程序名

方法二:使用Environment对象

static void Main(string[] args)
{
    string[] userInputArgs = Environment.GetCommandLineArgs();
    foreach (string arg in userInputArgs)
    {
        Console.WriteLine(arg);
    }
    
    Console.ReadKey();
}

获取控制台输入字符

static void Main(string[] args)
{
    string userInputLine = Console.ReadLine();
    Console.WriteLine(userInputLine);
    
    Console.ReadKey();
}

如何减少unbox和boxing

方法一:定义类型的时候,使用泛型方法、或者泛型类型

方法二:定义重载方法

参考:

https://msdn.microsoft.com/en-us/library/system.object.aspx

中的Remark

标准相等处理(Standard Equality Protocols)

说明

默认情况下

值类型使用对值进行比较来确定相等

引用类型使用对引用进行比较来确定相等

可以Override默认的相等来实现自定义的相等比较

自定义相等比较的方法:

​ The == and != operators

The virtual Equals method in object

The IEquatable interface

标准Override相等的方法:

Override GetHashCode() and Equals()

(Optionally) overload != and ==

(Optionally) implement IEquatable

实例:结构标准Override

public struct Area : IEquatable <Area>
{
    public readonly int Measure1;
    public readonly int Measure2;
    public Area (int m1, int m2)
    {
        Measure1 = Math.Min (m1, m2);
        Measure2 = Math.Max (m1, m2);
    }
    public override bool Equals (object other)
    {
        if (!(other is Area)) return false;
        return Equals ((Area) other); // Calls method below
    }
    public bool Equals (Area other) // Implements IEquatable<Area>
            => Measure1 == other.Measure1 && Measure2 == other.Measure2;
    public override int GetHashCode()
            => HashCode.Combine (Measure1, Measure2);
    public static bool operator == (Area a1, Area a2) => a1.Equals (a2);
    public static bool operator != (Area a1, Area a2) => !a1.Equals (a2);
}

相等重写最佳实践

重写equality operators (Equals(), ==, and !=)

重写GetHashCode() on value types if equality is meaningful.

实现IEquatable接口

Equals比较

使用Equals比较如果参数为Null,会抛出NullReferenceException异常

可以使用下面这种Override的方式进行重写:

public static bool AreEqual (object obj1, object obj2)
{
 if (obj1 == null) return obj2 == null;
 return obj1.Equals (obj2);
}

实例:注意==和Equal的差异

double x = double.NaN;
Console.WriteLine (x == x); // False
Console.WriteLine (x.Equals (x)); // True

实例:注意==和Equal的差异

var sb1 = new StringBuilder ("foo");
var sb2 = new StringBuilder ("foo");
Console.WriteLine (sb1 == sb2); // False (referential equality)
Console.WriteLine (sb1.Equals (sb2)); // True (value equality)

object.Equals静态方法

public static bool Equals (object objA, object objB)

实例:

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

object.ReferenceEquals静态方法

实例:

Widget w1 = new Widget();
Widget w2 = new Widget();
Console.WriteLine (object.ReferenceEquals (w1, w2)); // False
IEquatable接口(IEquatable interface)
public interface IEquatable<T>
{
 bool Equals (T other);
}

实例:

class Test<T> where T : IEquatable<T>
{
 public bool IsEqual (T a, T b)
 {
 return a.Equals (b); // No boxing with generic T
 }
}

标准比较处理(Standard Order Comparison)

标准比较重写

使用IComparable interfaces (IComparable and IComparable)

重写 > and < operators

IComparable接口

大部分的基础类型都实现了IComparable接口

IComparable通常用于排序比较、集合中

具体的接口定义如下:

public interface IComparable
{ 
    int CompareTo(object other); 
}
public interface IComparable<in T> 
{ 
    int CompareTo(T other); 
}

实例:string类型已经预定义了IComparable接口

string[] colors = { "Green", "Red", "Blue" };
Array.Sort (colors);
foreach (string c in colors) Console.Write (c + " "); // Blue Green Red

实例:结构重写IComparable接口和IEqualable接口

public struct Note : IComparable<Note>, IEquatable<Note>, IComparable
{
    int _semitonesFromA;
    public int SemitonesFromA { get { return _semitonesFromA; } }
    public Note (int semitonesFromA)
    {
        _semitonesFromA = semitonesFromA;
    }
    public int CompareTo (Note other) // Generic IComparable<T>
    {
        if (Equals (other)) return 0; // Fail-safe check
        return _semitonesFromA.CompareTo (other._semitonesFromA);
    }
    int IComparable.CompareTo (object other) // Nongeneric IComparable
    {
        if (!(other is Note))
        throw new InvalidOperationException ("CompareTo: Not a note");
        return CompareTo ((Note) other);
    }
    public static bool operator < (Note n1, Note n2)
        => n1.CompareTo (n2) < 0;
    public static bool operator > (Note n1, Note n2)
        => n1.CompareTo (n2) > 0;
    public bool Equals (Note other) // for IEquatable<Note>
        => _semitonesFromA == other._semitonesFromA;
    public override bool Equals (object other)
    {
        if (!(other is Note)) return false;
        return Equals ((Note) other);
    }
    public override int GetHashCode() => _semitonesFromA.GetHashCode();
    public static bool operator == (Note n1, Note n2) => n1.Equals (n2);
    public static bool operator != (Note n1, Note n2) => !(n1 == n2);
}

重写 > and < operators

大部分基础类型都重写了>和<运算符

实例:

bool after2010 = DateTime.Now > new DateTime (2010, 1, 1);

类型不同但成员相同的比较

实例:

object[] a1 = { "string", 123, true };
object[] a2 = { "string", 123, true };
Console.WriteLine (a1 == a2); // False
Console.WriteLine (a1.Equals (a2)); // False
IStructuralEquatable se1 = a1;
Console.WriteLine (se1.Equals (a2,
StructuralComparisons.StructuralEqualityComparer)); // True

标签:教程,Console,C#,object,Equals,Note,other,Other,public
From: https://www.cnblogs.com/cqpanda/p/16718941.html

相关文章

  • C#教程 - 深入理解C#与.NET
    更新记录转载请注明出处:2022年9月25日发布。2022年9月10日从笔记迁移到博客。CILTypeDef类型定义TypeRef引用其他程序集的类型Assembly......
  • C#教程 - 模式匹配(Pattern matching)
    更新记录转载请注明出处:2022年9月25日发布。2022年9月10日从笔记迁移到博客。常见匹配模式类型匹配模式(typepattern)属性匹配模式(propertypattern)匹配模式可以......
  • 银河麒麟v10图形化完成DCA培训内容(基于达梦8)
    本文基于银河麒麟v10服务器版使用图像化方式完成DCA培训学习相关内容,如需命令行方式可观看上一篇:https://www.cnblogs.com/zdstudy/p/16726249.html安装数据库a.创建用......
  • win10下vscode链接wsl2
    win10下vscode链接wsl2其实之前一直对vscode有很不好的印象:比如编译正常但标红、json配置文件嘎嘎多难以上手;但是这一回被朋友推荐用它,拎出一个中午专门搞了下,感觉它的代......
  • static静态变量的理解
    静态变量类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存......
  • vue3 基础-自定义指令 directive
    上篇内容是关于mixin混入的一些操作,也是关于代码复用层面的,本篇讲自定义指令directive也是为了实现复用而设计的一些小功能啦.先来看看,如果不用directive的场......
  • Vue-router NavigationDuplicated 产生原因和解决方法
    当你的Vue项目在当前的路由下企图再次导航到当前路由时就会出现NavigationDuplicated的问题(通俗来讲就是多次进入了同一个path,比如说当前你在/user/user-list页面,这时候你......
  • cobbler的部署
    cobbler部署//配置yum源[root@localhost~]#curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo%Total%......
  • 规范你的 JSON 配置,试试 JSON schema
    不知道大家在写一些JSON配置时会不会经常觉得麻烦,每次都要打开文档去核对字段名称对不对、结尾有没有s、结构是否正确、是不是数组等问题。然而我最近发现一些开源项目......
  • Pytorch实现VAE
    变分自编码器Pytorch实现。1classVAE(nn.Module):2def__init__(self):3super(VAE,self).__init__()45self.fc1=nn.Linear(784,......