"วิธีการคงที่" ใน C # คืออะไร


177

หมายความว่าอย่างไรเมื่อคุณเพิ่มคำหลักแบบคงที่ให้กับวิธีการ

public static void doSomething(){
   //Well, do something!
}

คุณสามารถเพิ่มstaticคำหลักลงในคลาสได้หรือไม่ ถ้าเช่นนั้นจะหมายความว่าอย่างไร


9
คุณสามารถใช้วิธีการคงที่โดยไม่ต้องสร้างอินสแตนซ์ของคลาสนั้นโดย class_name.static_method_name ();
Javed Akram

ในระดับการเขียนโปรแกรมเรารู้สึกว่าเราสามารถเรียกใช้วิธีการคงที่โดยไม่ต้องสร้างตัวอย่างของคลาส / ประเภท ภายในไม่ใช่กรณี CLR ภายในจัดการอินสแตนซ์พิเศษที่เรียกว่าอินสแตนซ์ประเภทสำหรับการจัดการการเรียกวิธีการคงที่ โปรดดูนี้คำตอบ มันน่าสนใจมาก
RBT

คำตอบ:


313

staticฟังก์ชั่นที่แตกต่างจากปกติ ( ตัวอย่าง ) ฟังก์ชั่นไม่เกี่ยวข้องกับอินสแตนซ์ของระดับชั้น

staticชั้นเป็นชั้นซึ่งสามารถมีstaticสมาชิกและดังนั้นจึงไม่สามารถ instantiated

ตัวอย่างเช่น:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

ในการโทรติดต่อInstanceMethodคุณต้องการอินสแตนซ์ของคลาส:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
ดังนั้นมันก็เหมือนกับวิธีการเรียนแทนวิธีการอินสแตนซ์?
Moshe

4
@Moshe: แน่นอน ด้วยวิธีสแตติกคุณไม่ต้องการอินสแตนซ์ของคลาสเพื่อเรียกเมธอดเพียงคลาส
ไบนารี Worrier

3
แต่จริง ๆ แล้วมีข้อ จำกัด ทางเทคนิคบางอย่างที่ป้องกันไม่ให้เรียกวิธีการคงที่ในตัวอย่าง? หากคอมไพเลอร์จะยอมให้มันอันตรายของการเข้าถึงคืออะไร?
kroonwijk

2
@kroon: มันจะไม่ทำให้รู้สึกใด ๆ วิธีการอินสแตนซ์ใช้อินสแตนซ์เป็นพารามิเตอร์แรกที่ซ่อน วิธีการคงที่ทำไม่ได้ ดูโพสต์บล็อกของฉัน: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

โดยที่ "StaticMethod" เป็นวิธีการเรียนและ "InstanceMethod" เป็นวิธีการเรียนของคลาส SomeClass
Usman Younas

26

จากมุมมองอื่น: พิจารณาว่าคุณต้องการเปลี่ยนแปลงบางอย่างในสายอักขระเดียว ตัวอย่างเช่นคุณต้องการสร้างตัวอักษรตัวพิมพ์ใหญ่และอื่น ๆ คุณสร้างคลาสอีกชื่อว่า "เครื่องมือ" สำหรับการกระทำเหล่านี้ ไม่มีความหมายในการสร้างอินสแตนซ์ของคลาส "เครื่องมือ" เนื่องจากไม่มีเอนทิตีใด ๆ ในชั้นเรียนนั้น (เปรียบเทียบกับคลาส "บุคคล" หรือ "ครู") ดังนั้นเราจึงใช้คีย์เวิร์ดแบบคงที่เพื่อใช้คลาส "เครื่องมือ" โดยไม่ต้องสร้างอินสแตนซ์ใด ๆ และเมื่อคุณกดจุดหลังชื่อคลาส ("เครื่องมือ") คุณสามารถเข้าถึงวิธีที่คุณต้องการ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
การใช้ "การเปลี่ยนแปลงสตริง" เป็นตัวอย่างที่ไม่ดี - สตริงนั้นไม่เปลี่ยนรูปและไม่สามารถเปลี่ยนแปลงได้ แต่มิฉะนั้นคำอธิบายที่เหมาะสม (แทนที่คลาสที่ไม่เปลี่ยนรูปสำหรับสตริง)
Flydog57

13

วิธีการแบบคงที่เขตข้อมูลทรัพย์สินหรือเหตุการณ์สามารถเรียกได้บนคลาสแม้ว่าไม่มีอินสแตนซ์ของคลาสที่ถูกสร้างขึ้น หากอินสแตนซ์ของคลาสใดถูกสร้างขึ้นจะไม่สามารถใช้เพื่อเข้าถึงสมาชิกแบบสแตติก มีสำเนาของเขตข้อมูลและเหตุการณ์เพียงหนึ่งสำเนาเท่านั้นและวิธีการและคุณสมบัติแบบคงที่สามารถเข้าถึงเขตข้อมูลแบบคงที่และเหตุการณ์แบบคงที่เท่านั้น สมาชิกแบบสแตติกมักใช้เพื่อแสดงข้อมูลหรือการคำนวณที่ไม่เปลี่ยนแปลงในการตอบสนองต่อสถานะวัตถุ ตัวอย่างเช่นห้องสมุดคณิตศาสตร์อาจมีวิธีการคงที่สำหรับการคำนวณไซน์และโคไซน์ สมาชิกคลาสแบบสแตติกถูกประกาศโดยใช้คีย์เวิร์ด static ก่อนชนิดการส่งคืนของ membe


5

ฟังก์ชั่นแบบคงที่หมายความว่ามันเกี่ยวข้องกับคลาส (ไม่ใช่อินสแตนซ์เฉพาะของคลาส แต่เป็นคลาสเอง) และสามารถเรียกใช้ได้แม้ว่าจะไม่มีอินสแตนซ์ของคลาสอยู่

คลาสแบบสแตติกหมายถึงคลาสนั้นมีสมาชิกแบบสแตติกเท่านั้น


5

ไม่นานคุณจะไม่สามารถยกตัวอย่างคลาสสแตติกได้: Ex:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

คุณไม่สามารถทำสิ่งนี้:

myStaticClass msc = new myStaticClass();  // it will cause an error

คุณสามารถทำได้เพียง:

myStaticClass.someFunction();

0

เมื่อคุณเพิ่มคีย์เวิร์ด "สแตติก" ให้กับเมธอดหมายความว่าการใช้งานต้นแบบจะให้ผลลัพธ์เดียวกันสำหรับอินสแตนซ์ของคลาสใด ๆ จำเป็นต้องพูดผลลัพธ์ขึ้นอยู่กับการเปลี่ยนแปลงในค่าของพารามิเตอร์


-1

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

โดยการทำให้ฟังก์ชั่นเป็นแบบคงที่มันจะ จำกัด การเข้าถึงฟังก์ชั่นภายในไฟล์นั้น


-1

แกนหลักของคำสำคัญคงที่คุณจะมีเพียงสำเนาเดียวที่RAMของนี้ (วิธี / ตัวแปร / คลาส) ที่ใช้ร่วมกันสำหรับการโทรทั้งหมด


-8

คำสำคัญคงที่เมื่อนำไปใช้กับชั้นเรียนบอกคอมไพเลอร์ในการสร้างอินสแตนซ์เดียวของชั้นเรียนนั้น มันเป็นไปไม่ได้ที่จะ 'ใหม่' หนึ่งหรือมากกว่าหนึ่งอินสแตนซ์ของชั้นเรียน วิธีการทั้งหมดในคลาสสแตติกต้องประกาศตัวเองแบบสแตติก

เป็นไปได้และมักเป็นที่ต้องการเพื่อให้มีวิธีการคงที่ของคลาสที่ไม่คงที่ ตัวอย่างเช่นวิธีการจากโรงงานเมื่อสร้างอินสแตนซ์ของคลาสอื่นมักจะประกาศเป็นสแตติกเนื่องจากหมายความว่าไม่จำเป็นต้องใช้อินสแตนซ์เฉพาะของคลาสที่มีเมธอดแฟกเตอร์

สำหรับคำอธิบายที่ดีว่าอย่างไรเมื่อไรและที่ไหนจะเห็นMSDN


8
ไม่คลาสสแตติกไม่เคยถูกสร้างอินสแตนซ์ ระบุว่าทุกอย่างในนั้นคงที่ทำไมคุณต้องการยกตัวอย่าง?
Jon Skeet

1
staticชั้นจะมีอินสแตนซ์ที่ไม่ทั้งหมด
SLaks

4
ขอโทษนะฉันไม่เข้าใจ ... ฉันพูดว่ามีการสร้างอินสแตนซ์เดียวและคุณไม่สามารถสร้างใหม่ได้ จะสร้างอินสแตนซ์เดียวคงที่มิฉะนั้นรหัสจะไม่สามารถเรียกได้?
Dave Arkley

2
คลาสสแตติกจะมีอินสแตนซ์ในความเป็นจริงที่สองพวกเขาไม่ได้อินสแตนซ์ของประเภท คลาสแบบสแตติกจะมีอยู่บนฮีปเป็นวัตถุชนิด [Foo] (ตารางการค้นหาวิธีการ ฯลฯ สำหรับ JIT) และวัตถุ System.Type พิเศษที่ใช้สำหรับการเริ่มต้น
mccainz

ชั้นสามารถประกาศคงที่แสดงให้เห็นว่ามันมีสมาชิกคงที่เท่านั้น ไม่สามารถสร้างอินสแตนซ์ของคลาสแบบคงที่ได้โดยใช้คำหลักใหม่ คลาสที่คงที่จะถูกโหลดโดยอัตโนมัติโดย. NET Framework ภาษาทั่วไปรันไทม์ (CLR) เมื่อโปรแกรมหรือ namespace ที่มีการโหลดชั้นเรียน
Satheesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.