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);
}
}
จากโค้ดจะมีสร้างวัตถุในบรรทัดที่ 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);
}
}
จากโค้ดในบรรทัดที่ 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
}
}
จากโค้ดในบรรทัดที่ 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();
}
}
ในบรรทัดที่ 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