【从Java转C#】第三章:对象和类型

简介: 【从Java转C#】第三章:对象和类型

对象和类型

ref和out

  • 双方都可以改变原始的地址
  • 初始值的不同
  • ref:需要赋予变量初始值
  • out:不需要赋予变量初始值
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            int j = 1;
            Swap(ref i, j);
            Console.WriteLine("i : " + i);
            Console.WriteLine("j : " + j);
            Console.ReadLine();
        }
        static void Swap(ref int i, int j)
        {
            i = 100;
            j = 101;
        }
    }
}

参数的使用

  • 命名参数:可以自己改变形参的顺序
Swap(lastName: "lastName", firstName: "firstName");
 static void Swap(string firstName, string lastName)
  {
      Console.WriteLine(firstName);
      Console.WriteLine(lastName);
  }
  • 可选参数:参数是可以选择的,但是可以选择的函数【可用可不用】必须在定义的参数后
static void Swap(string lastName, string firstName = "231")
    {
        Console.WriteLine(firstName);
        Console.WriteLine(lastName);
    }

方法的重载

  • 方法名相同、参数的个数或类型不同、同一个类中
  • C#限制
  • 两个方法不能仅在返回类型上有区别
  • 两个方法不能根据参数是声明为ref还是out来区分
void display(string name1)
  {
        // *****
    }
 void display(string name1, string name2)
    {
        // *****
    }

属性

  • 正常的get/set
class student
    {
        private int _age;
        public int Age
        {
            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }
    }
  • 自动的实现:用于没有任何逻辑,单单实现功能而已
class student
    {
        private int _age;
        public int Age { get; set; }
    }

构造函数

  • 不书写任何的构造函数:引用类型:空引用、数值类型:0、bool:false
student st = new student();
 Console.WriteLine(st.age);
 class student
  {
     public int age;
  }
  • 书写带参的构造函数:在进行实例化时,就要实现带参
  • this:一般使用this来代表当前的属性
class student
    {
        public int age;
        public student(int age)
        {
            this.age = age;
        }
    }
  • 静态构造函数:构造函数只执行一次,只要创建类的对象,就会执行它
class student
    {
        public int age;
        static student()
        {
           // write your code
        }
    }
  • 构造函数调用其他的构造函数:有点方便~但我感觉多了容易乱、对于父类的调用,使用base
class student
    {
        private int age;
        private string name;
        public student(int age, string name)
        {
            this.age = age;
            this.name = name;
        }
        public student(int age)
        {
            this.age = age;
            this.name = "黄良帅";
        }
    }
======================================分割线=================================
   class student
    {
        private int age;
        private string name;
        public student(int age, string name)
        {
            this.age = age;
            this.name = name;
        }
        public student(int age):this(age, "黄良帅")
        {
        }
    }  
  • 只读字段【readonly】:可以在构造函数中给其赋值,但不能在其他地方赋值
readonly int a = 1;
 a  = 2; // 错误,找不到a
 public student()
   {
        a = 2;
   }

匿名类型

  • new的一样,Type就一样
var captain = new { firstName = "hls", lastName = "s" };
var doctor = new { firstName = "s", lastName = "s" };
Console.WriteLine(captain.GetType());
Console.WriteLine(doctor.GetType());
  • 也可以直接实例化对象
var capion = new student();

结构【Struct

  • 结构的特点
  • 结构是值类型,不是引用类型
  • 结构不支持继承
  • 对于结构,构造函数的工作方式有一些区别。尤其是编译器总是提供一个无参数的默认构造函数,它是不允许被替代的。
  • 使用结构,可以指定字段如何在内存中布局
  • 结构和类
  • 相同
doctor doc;
 student stu;
=============分割线==========
 doctor doc = new doctor();
 student stu = new student();
  • 不同
doctor doc;
 student stu;
 =============分割线==========
 doc.age = 1;
 stu.age = 1; // 错误:对于类来说,没有new【引用】,不能直接赋值

弱引用(WeakReference)

  • 个人感觉这一块和Java的GC回收差不多,基本参考强弱软虚
  • 这里等看了C#的垃圾回收再来填坑

静态类

  • 如果类只包含静态的方法和属性,这个类就是静态的
  • 一旦类被static修饰后,就不能使用实例创建
student stu = new student(); // 会报错
 static class student
    {
        public int age;
        public string name;
    }

Object

  • ToString 虚方法
  • Equals
  • GetHashCode
  • GetType
  • MemberwiseClone 复制对象


相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
1月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
1月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
68 2
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
37 3
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
61 1
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
34 6
|
2月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
250 5