Page cover image

Different ways to create an Object

ธัญชนก จัตตุพงศ์ 650710553

ในภาษา C# การสร้างวัตถุ (Object) ได้หลายวิธีและเราจะมาดูกันว่าสามารถทำวิธีไหนได้บ้าง

1.การใช้ new operator

คำสั่ง new เป็น operator ที่ใช้เพื่อสร้างอินสแตนซ์ (instance) ของคลาสหรือที่เราเรียกว่าวัตถุ โดยจะกำหนดพื้นที่ในหน่วยความจำให้กับวัตถุระหว่างรันไทม์เท่านั้น ซึ่งหมายความว่าเป็นการจัดสรรพื้นที่แบบไดนามิก อยู่ในหน่วยความจำ heap ซึ่งหากไม่มีคำสั่ง new ก็จะไม่มีการจองพื้นที่ให้กับหน่วยความจำ ทำให้ตัวแปรที่อ้างอิงถึงวัตถุนั้นมีค่าเป็น null

syntax

className ObjectName = new className(); 

โดย ObjectName คือ ชื่อตัวแปรที่กำหนดให้วัตถุ className คือ ชื่อคลาสที่ต้องการสร้างวัตถุ new คือ คำสั่งในการสร้าง instance ของคลาส className className() คือ เมธอดที่ใช้สำหรับกำหนดค่าเริ่มต้นให้กับวัตถุเมื่อมันถูกสร้างขึ้น(Constructor)

ตัวอย่าง

class Car 
{
  string color = "red"; //field ของ คลาส Car

  static void Main(string[] args)
  {
    Car c= new Car(); 
    Console.WriteLine(c.color);
  }
}
output
red

จากโค้ดจะมีสร้างวัตถุในบรรทัดที่ 7 มี Car c= new Car(); จะเป็นการสร้างวัตถุจากคลาส Car ชื่อว่า c โดยใช้คำสั่ง new ตามด้วย Car() ซึ่งเป็น constructor

2.สร้างการอ้างอิง(reference)สำหรับวัตถุที่มีอยู่แล้ว

การอ้างอิง สามารถประกาศได้โดยใช้ชื่อคลาสและชื่อตัวแปรที่ใช้ในการอ้างอิง (reference variable) ซึ่งตัวแปรใหม่นี้จะชี้ไปยังวัตถุที่มีอยู่แล้วในหน่วยความจำ ดังนั้นเมื่อมีการเปลี่ยนแปลงค่าผ่านตัวแปรที่อ้างอิง การเปลี่ยนแปลงนี้จะมีผลต่อวัตถุที่ทุกตัวแปรอ้างถึง เพราะตัวแปรทั้งหมดชี้ไปยังวัตถุเดียวกัน เหมือนกับการใช้นามแฝง(alias) สำหรับวัตถุเดียวกัน

syntax

className RefName; 
RefName = objectName;

โดย RefName คือ ชื่อตัวแปรของคลาสที่อยากอ้างอิง และตัวแปร objectName คือวัตถุที่ถูกสร้างขึ้นมาแล้ว โดยในที่นี้ Refname อ้างอิง objectName นั่นเอง

ตัวอย่าง

using System;
public class Person
{
    public string Name { get; set; } //คลาสมี properties 2 ตัวคือ Name,Age
    public int Age { get; set; }
    public Person(string name, int age) //constructor กำหนด ค่า Name และ Age
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        // สร้าง object จากคลาส Person ชื่อ person1 โดยกำหนดค่า Name = "Leopold",Age = 6.
        Person person1 = new Person("Leopold", 6);
        Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);
      
       Person person2 = person1; //สร้างการ reference

        // เมื่อเปลี่ยนค่า Name,Age ด้วย person2,ค่า Name,Age ใน person1 ก็โดนเปลี่ยนไปด้วย
        person2.Name = "Molly";
        person2.Age = 16;

        Console.WriteLine("person2 Name = {0} Age = {1}", person2.Name, person2.Age);
        Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);
    }
}
output
 person1 Name = Leopold Age = 6 
 person2 Name = Molly Age = 16 //เมื่อ person2 เปลี่ยนค่า Name และ Age
 person1 Name = Molly Age = 16 // ส่งผลต่อ person1 ด้วย

จากโค้ดในบรรทัดที่ 21 จะมีการสร้างการอ้างอิง โดยประกาศตัวแปรใหม่ชื่อ person2 ที่จะให้อ้างอิงไปยังวัตถุเดียวกันกับ person1

3.สร้างอาเรย์ของวัตถุ

เราสามารถสร้างวัตถุเป็นอาเรย์ได้เมื่อเราอยากสร้างหลายวัตถุจากคลาสเดียวกัน โดยการประกาศอาเรย์จากนั้นกำหนดชื่อคลาสและขนาดของอาเรย์ที่ต้องการเก็บวัตถุ จากนั้นกำหนดค่าให้กับองค์ประกอบแต่ละตัว คือ สร้างวัตถุใหม่และเก็บลงในแต่ละตำแหน่งของอาเรย์ ทั้งนี้เราอาจใช้ for loop ช่วยทำการกำหนดค่าของวัตถุแต่ละตัวหรือสร้างวัตถุใหม่เก็บลงแต่ละตำแหน่งในอาเรย์ได้อัตโนมัติก็ได้

syntax

className[] arrayName = new className[size];

ประกาศอาเรย์โดย className คือ คลาสที่ต้องการสร้างอาเรย์ของวัตถุ arrayName คือ ชื่ออาเรย์ size คือ ขนาดอาเรย์(จำนวนวัตถุ)

ตัวอย่าง (สร้างวัตถุแบบไม่ใช้ for loop)

using System;
class employee {
  //มีฟิลด์แบบ private ทั้งหมด 3 ฟิลด์ คือ empName empId และ empDesig
    private string empName;
    private int empId;
    private string empDesig;
  // method EmpInfo รับข้อมูลพนักงานและกำหนดค่าให้กับฟิลด์ต่างๆ
    public void EmpInfo(string empName, int empId, string empDesig) {
      this.empId = empId;
      this.empDesig = empDesig;
      this.empName = empName;
    }
  //method showEmployeeDetails ใช้สำหรับแสดงข้อมูลพนักงานที่เก็บไว้
    public void showEmployeeDetails() {
      Console.WriteLine("\nEmployee Record: ");
      Console.WriteLine("\t    Emp Name: " + empName);
      Console.WriteLine("\t        Id  : " + empId);
      Console.WriteLine("\tDesignation : " + empDesig);
    }
  }

  class EmployeeTest {
    public static void Main() {
  //ประกาศอาเรย์ของวัตถุ 
      employee[] e = new employee[3];
  //สร้างวัตถุให้แต่ละตำแหน่งของอาเรย์
      e[0] = new employee();
      e[1] = new employee();
      e[2] = new employee();
  //ใช้method EmpInfo กำหนดข้อมูลพนักงานแต่ละคนให้กับวัตถุในอาเรย์
      e[0].EmpInfo("Shan", 132, "Manager"); //กำหนดค่าให้วัตถุตำแหน่งที่ 0
      e[0].showEmployeeDetails();//แสดงข้อมูลพนักงานของวัตถุตำแหน่งที่ 0
      e[1].EmpInfo("Casper", 131, "CEO");//กำหนดค่าให้วัตถุตำแหน่งที่ 1
      e[1].showEmployeeDetails();//แสดงข้อมูลพนักงานของวัตถุตำแหน่งที่ 1
      e[2].EmpInfo("Olga", 139, "Team Leader");//กำหนดค่าให้วัตถุตำแหน่งที่ 2
      e[2].showEmployeeDetails();//แสดงข้อมูลพนักงานของวัตถุตำแหน่งที่ 2
    }
  }
output
Employee Record:
	    Emp Name: Shan
	        Id  : 132
	Designation : Manager
Employee Record:
	    Emp Name: Casper
	        Id  : 131
	Designation : CEO

Employee Record:
	    Emp Name: Olga
	        Id  : 139
	Designation : Team Leader

จากโค้ดในบรรทัดที่ 25 จะมีการประกาศอาเรย์ของวัตถุ โดยเก็บวัตถุ employee ได้ 3 ตัว และสร้างวัตถุในบรรทัดที่ 27-29 โดยแต่ละตำแหน่งของอาเรย์จะถูกกำหนดให้เป็นวัตถุใหม่จากคลาส employee ซึ่งใช้คำสั่ง new

หากอยากใช้ for loop ในการสร้างวัตถุแบบอัตโนมัติสามารถแก้ไขใน method Main( ) และเราจะมีการกำหนดค่าแบบอาร์เรย์ไปพร้อมกันกับการสร้างวัตถุ ซึ่งสามารถทำได้ดังนี้

public static void Main()
    {
        // ประกาศอาเรย์ของ Employee ขนาด 3 ช่องเหมือนเดิม
        Employee[] employees = new Employee[3];

        // เตรียมข้อมูลพนักงานในรูปแบบอาเรย์(กรณีอยากกำหนดค่าให้วัตถุแบบอาเรย์ด้วย)
        string[] names = { "Shan", "Casper", "Olga" };
        int[] ids = { 132, 131, 139 };
        string[] designations = { "Manager", "CEO", "Team Leader" };

        // ใช้ for loop ในการสร้างและกำหนดค่าให้กับวัตถุในอาเรย์แบบอัตโนมัติ
        for (int i = 0; i < employees.Length; i++){
        
            employees[i] = new Employee(); // สร้างวัตถุ Employee ใหม่
            employees[i].EmpInfo(names[i], ids[i], designations[i]); // กำหนดค่าให้วัตถุ
        }

        // ใช้ for loop ในการแสดงรายละเอียดของพนักงานแต่ละคน ตามตำแหน่งอาเรย์ของวัตถุ
        for (int i = 0; i < employees.Length; i++){
        
        employees[i].showEmployeeDetails(); // แสดงข้อมูลพนักงาน
        }
    }

4.แบบ Type Inference

เป็นการสร้างวัตถุขึ้นมาโดยใช้คำสั่ง var ร่วมกับคำสั่ง new ส่งผลให้ทำให้ตัวแปรของวัตถุนั้นมีชนิดข้อมูลตรงกับวัตถุที่ถูกสร้างขึ้นโดยไม่ต้องระบุชนิดข้อมูลชัดเจน

syntax

var ObjectName = new className();

ตัวอย่าง

using System;
class Customer {
//คลาส Customer มีสาม properties คือ CustomerID, Name, และ Email
    public int CustomerID { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }

//constructor ของคลาส Customer
    public Customer(int id, string name, string email) {
        CustomerID = id;
        Name = name;
        Email = email;
    }
//method แสดงข้อมูลลูกค้า
    public void DisplayCustomerInfo() {
        Console.WriteLine($"Customer ID: {CustomerID}");
        Console.WriteLine($"Name: {Name}");
        Console.WriteLine($"Email: {Email}");
    }
}

class Program {
    static void Main(string[] args) {
        // การสร้างวัตถุ customer ด้วย var
        var customer = new Customer(101, "Alice", "alice@example.com");

        // เรียกใช้เมธอดเพื่อแสดงข้อมูลของลูกค้า
        customer.DisplayCustomerInfo();
    }
}
output
Customer ID: 101
Name: Alice
Email: alice@example.com

ในบรรทัดที่ 25 เป็นการสร้างวัตถุใหม่จากคลาส Customerโดยใช้ตัวแปรที่ถูกประกาศด้วยคำสั่ง var ซึ่งตัวแปร customer จะถูกกำหนดชนิดข้อมูลให้เป็น Customer โดยอัตโนมัติ และมีคอนสตรัคเตอร์ซึ่งรับพารามิเตอร์ 3 ตัว คือ ID, Name, Email

การสร้าง object ระหว่างภาษา C,Java และ Python

C++- การสร้างวัตถุของภาษานี้ทำได้ด้วยการระบุชื่อคลาสตามด้วยชื่อวัตถุ

Java- ในการสร้างวัตถุจากคลาสใดๆ ให้ระบุชื่อคลาส ตามด้วยชื่อวัตถุ และใช้คำสั่ง new ซึ่งการสร้างวัตถุใน Java มีความคล้ายคลึงกับการสร้างวัตถุใน C# เพราะทั้งสองภาษาใช้แนวคิด OOP และ วิธีการใช้งานรวมถึงการเข้าถึงเมธอดที่คล้ายกัน

Python-การสร้างวัตถุใน Python ทำได้ง่าย มีความยืดหยุ่นมากกว่า C# เพราะ C# เป็น statically typed language ต้องระบุชนิดข้อมูลในการประกาศตัวแปร ส่วน python เป็นแบบ Dynamically typed language ไม่จำเป็นต้องระบุชนิดข้อมูลในการประกาศตัวแปร ทำให้สามารถเปลี่ยนแปลงประเภทของข้อมูลที่เก็บได้ในระหว่างการรันโปรแกรม

ตัวอย่าง

#include <iostream>
#include <string>

using namespace std;

//คลาส Person
class Person {
public:
    // มีสมาชิกสองตัว คือ name และ age
    string name;
    int age;

    // ฟังก์ชัน introduce() ใช้ในการแสดงข้อความ โดยใช้ข้อมูลจาก name และ age
    void introduce()
    {
        cout << "Hi, my name is " << name << " and I am "
             << age << " years old." << endl;
    }
};
int main()
{
    // สร้างวัตถุ person1 จากคลาส Person
    Person person1;

    // กำหนดค่าให้ name และ age ผ่านวัตถุ person1
    person1.name = "Alice";
    person1.age = 30;

    // เรียกใช้ฟังก์ชัน introduce() ผ่านวัตถุ person1 เพื่อแสดงข้อมูล
    person1.introduce();

    return 0;
}

output

Hi, my name is Alice and I am 30 years old.

อธิบายส่วนที่มีการสร้างวัตถุของ C++, Java และ Python จากโค้ดข้างบน

บรรทัดที่ 23 Person person1; คือการสร้างตัวแปร person1 ซึ่งเป็น instance ของ class Person โดย person1 เป็นวัตถุที่มีสมาชิกภายในคือ name และ age ซึ่งสามารถเข้าถึงได้ผ่านวัตถุนี้ รวมถึงการใช้ฟังก์ชันภายในคลาส Person อีกด้วย ทั้งนี้เนื่องจากไม่มีคำสั่ง new จึงจัดสรรพื้นที่ใน stack ซึ่งวัตถุจะถูก deallocate โดยอัตโนมัติเมื่อออกจากขอบเขต หรือในที่นี้คือเมื่อฟังก์ชัน main() จบการทำงาน และถ้าเราอยากใช้คำสั่ง new สามารถทำได้ดังนี้

int main() //แก้ไขแค่ในฟังก์ชัน main()
{
    // สร้างวัตถุ Person และมี person1 ที่เป็น pointer อ้างอิงถึงวัตถุนั้น
    Person* person1 = new Person;

    // กำหนดค่าให้ name และ age ผ่าน pointer person1
    person1->name = "Alice";
    person1->age = 30;

    // เรียกใช้ฟังก์ชัน introduce() ผ่าน pointer person1 เพื่อแสดงข้อมูล
    person1->introduce();

    // คืนหน่วยความจำเมื่อใช้เสร็จ
    delete person1;

    return 0;
}

ในบรรทัดที่ 4 Person* person1 = new Person; ด้วยคำสั่ง new นี้ จะทำให้จองพื้นที่ใน heap โดยมี pointer person1 ชี้ไปที่วัตถุ Person เพื่ออ้างอิงและต้องมีการใช้ delete กับ person1 เพื่อคืนหน่วยความจำเมื่อไม่ต้องการใช้อีกต่อไป ซึ่งต่างจาก C# ที่มี garbage collector คอยจัดการ deallocate พื้นที่ของวัตถุให้อัตโนมัติ

PDF-Different ways to create an Object

Different way to create an object

VDO

Reference

ภาษา C#

หัวข้อ คำสั่ง new, การสร้างการอ้างอิง (reference) และ หัวข้อสร้างอาเรย์ของวัตถุ

manasikirloskar. (2021, August 18). Different ways to create an Object in C#. GeeksforGeeks. https://www.geeksforgeeks.org/different-ways-to-create-an-object-in-c-sharp/

หัวข้อ คำสั่ง new

BillWagner. (2023, November 14). new operator - Create and initialize a new instance of a type - C# reference. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/new-operator

C# Classes and Objects. (n.d.). W3Schools. https://www.w3schools.com/cs/cs_classes.php

หัวข้อการสร้างการอ้างอิง (reference)

BillWagner. (2021, September 17). Objects - create instances of types - C#. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/objects

หัวข้อสร้างอาเรย์ของวัตถุ

Zeeshan, M. (2024, February 2). How to declare an array of objects in C#. Delft Stack. https://www.delftstack.com/howto/csharp/csharp-array-of-objects/

หัวข้อ แบบ Type Inference

ศุภชัย สมพานิช. (2566). คู่มือ Codingและพัฒนาแอปพลิเคชันด้วย C# (พิมพ์ครั้งที่ 1). ไอดีซีฯ.

ภาษา C++

Kexugit. (2019, October 24). C++ -> C#: What You Need to Know to Move from C++ to C#. Microsoft Learn. https://learn.microsoft.com/en-us/archive/msdn-magazine/2001/july/c-csharp-what-you-need-to-know-to-move-from-c-to-csharp

Dang, T. (2024, September 24). C# vs C++: A Side-by-Side Comparison for Beginners. Orient Software. https://www.orientsoftware.com/blog/csharp-vs-cplusplus/

Abhirav Kariya. (2024, July 15). C++ classes and objects. GeeksforGeeks. https://www.geeksforgeeks.org/c-classes-and-objects/

pikuma. (2021, March 2). C++ Objects: Stack vs. Heap [Video]. YouTube. https://www.youtube.com/watch?v=PCnDoknVFK4

ภาษา Java

How to create object in Java - Javatpoint. (n.d.). javatpoint. https://www.javatpoint.com/how-to-create-object-in-java

Java Classes and Objects. (n.d.). W3Schools. https://www.w3schools.com/java/java_classes.asp

BillWagner. (2024, April 9). Tips for Java Developers - A tour of C#. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/tips-for-java-developers

ภาษา Python

nikhilaggarwal3. (2024, September 9). Python classes and objects. GeeksforGeeks. https://www.geeksforgeeks.org/python-classes-and-objects/

Timilehin, O. (2023, January 19). Want to explore the OOP World of Java and Python? Read This. Linkedin. https://www.linkedin.com/pulse/want-explore-oop-world-java-python-read-olowookere-timilehin

MKS075. (2023, May 8). Difference between Python and C#. GeeksforGeeks. https://www.geeksforgeeks.org/difference-between-python-and-c-sharp/

Last updated