Bagaimana saya bisa mendapatkan tipe data variabel di C #?


96

Bagaimana cara mengetahui tipe data apa yang dimiliki beberapa variabel? (misalnya int, string, char, dll.)

Saya punya sesuatu seperti ini sekarang:

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

namespace Testing
{
    class Program
    {
        static void Main()
        {
            Person someone = new Person();
            someone.setName(22);
            int n = someone.getName();
            Console.WriteLine(n.typeOf());
        }
    }

    class Person
    {
        public int name;

        public void setName(int name)
        {
            this.name = name;
        }

        public int getName()
        {
            return this.name;
        }
    }
}

6
Anda sudah menentukan tipenya -int
Jamiec

Tidak jelas apa yang Anda maksud dengan "temukan tipe datanya". Biasanya, jawabannya adalah "Anda hanya melihat tanda tangan anggota kelas dan jenisnya dinyatakan di sana secara eksplisit". Apakah niat Anda untuk memeriksa anggota kelas dalam jangka waktu yang lama?
Wiktor Zychla

1
Di luar subjek, tetapi yang Anda tulis di sini lebih baik ditulis seperti ini dengan C #: class Person { public string Name { get; set; } }atau class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }. Baca dokumentasi tentang Properti
Steve B

1
Jamiec benar. Pengetikan statis berarti deklarasi menyetel tipe Anda selamanya. Variabel n Anda hanya bisa dari tipe yang Anda deklarasikan, atau tipe yang diwariskan. Dalam kasus spesifik Anda, Anda memilih untuk menampilkan int, itu adalah tipe yang tidak dapat Anda warisi, jadi n hanya bisa menjadi int.
Ksempac

Jawaban:


124

Ada masalah penting dan halus yang tidak satupun dari mereka tangani secara langsung. Ada dua cara untuk mempertimbangkan tipe dalam C #: tipe statis dan tipe run-time .

Jenis statis adalah jenis variabel di kode sumber Anda. Oleh karena itu, ini adalah konsep waktu kompilasi. Ini adalah jenis yang Anda lihat di tooltip saat Anda mengarahkan kursor ke atas variabel atau properti di lingkungan pengembangan Anda.

Anda bisa mendapatkan tipe statis dengan menulis metode generik helper agar inferensi tipe mengurusnya untuk Anda:

   Type GetStaticType<T>(T x) { return typeof(T); }

Jenis run-time adalah jenis objek dalam memori. Oleh karena itu, ini adalah konsep run-time. Ini adalah tipe yang dikembalikan oleh GetType()metode.

Jenis waktu proses suatu objek sering kali berbeda dari jenis statis variabel, properti, atau metode yang menampung atau mengembalikannya. Misalnya, Anda dapat memiliki kode seperti ini:

object o = "Some string";

Jenis statis variabel adalah object, tetapi pada waktu proses, jenis referensi variabel adalah string. Oleh karena itu, baris berikutnya akan mencetak "System.String" ke konsol:

Console.WriteLine(o.GetType()); // prints System.String

Namun, jika Anda mengarahkan kursor ke variabel odi lingkungan pengembangan, Anda akan melihat jenisnya System.Object(atau objectkata kunci yang setara ). Anda juga melihat hal yang sama menggunakan fungsi helper kami dari atas:

Console.WriteLine(GetStaticType(o)); // prints System.Object

Untuk variabel nilai-jenis, seperti int, double, System.Guid, Anda tahu bahwa jenis run-time akan selalu sama dengan jenis statis, karena jenis nilai tidak dapat berfungsi sebagai kelas dasar untuk jenis lain; jenis nilai dijamin menjadi jenis yang paling banyak diturunkan dalam rantai warisannya. Ini juga berlaku untuk tipe referensi tersegel: jika tipe statis adalah tipe referensi tersegel, nilai run-time harus berupa turunan dari tipe tersebut atau null.

Sebaliknya, jika tipe statis dari variabel tersebut adalah tipe abstrak, maka dijamin tipe statis dan tipe runtime akan berbeda.

Untuk menggambarkannya dalam kode:

// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));

// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));

// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));

// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));

3
jadi variable.getType()mengembalikan tipe runtime (tipe sisi kanan), tapi apa yang mengembalikan tipe statis (tipe sisi kiri variabel)?
barlop

@barlop yang diketahui pada waktu kompilasi. Anda bisa menggunakan typeofuntuk mendapatkan objek tipe saat runtime untuk tipe statis.
phoog

ya saya tahu tipe statis = tipe waktu kompilasi, dan tipe runtime = tipe dinamis. Meskipun mendapatkan jenis variabel 'a', Anda tidak dapat melakukannya typeof(a) jika Anda melakukannya typeof(int)akan mengembalikan int, tetapi tidak memeriksa variabel 'a' dan menunjukkan jenis 'a' .. Bisa dibilang Anda tidak perlu menunjukkan tipe statis 'a', mungkin memang begitu, tetapi kenyataannya tidak menunjukkannya. Jadi saya tidak melihat bagaimana penggunaan typeof di sini berguna.
barlop

4
@barlop Anda dapat melakukan ini agar inferensi jenis mengurusnya untuk Anda:Type GetStaticType < T > (T x) { return typeof(T); }
phoog

1
@Jaquarh seperti yang Anda ketahui, switchsekarang mendukung pencocokan pola untuk pengujian jenis (jenis waktu proses, bukan statis). Alih-alih mengaktifkan nilai yang dikembalikan dari GetType (), Anda mengaktifkan variabel secara langsung.
phoog

19

Sangat sederhana

variable.GetType().Name

itu akan mengembalikan tipe data Anda dari variabel Anda


16

Secara umum, Anda hampir tidak perlu melakukan perbandingan tipe kecuali Anda melakukan sesuatu dengan refleksi atau antarmuka. Namun:

Jika Anda tahu tipe yang ingin Anda bandingkan, gunakan operator isatau as:

if( unknownObject is TypeIKnow ) { // run code here

The asoperator melakukan cast yang kembali nol jika gagal daripada pengecualian:

TypeIKnow typed = unknownObject as TypeIKnow;

Jika Anda tidak mengetahui jenisnya dan hanya ingin informasi jenis waktu proses, gunakan metode .GetType ():

Type typeInformation = unknownObject.GetType();

Di versi C # yang lebih baru, Anda dapat menggunakan isoperator untuk mendeklarasikan variabel tanpa perlu menggunakan as:

if( unknownObject is TypeIKnow knownObject ) {
    knownObject.SomeMember();
}

Sebelumnya Anda harus melakukan ini:

TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
    knownObject.SomeMember();
}

4

Tahan kursor di atas anggota yang Anda minati, dan lihat tooltip - ini akan menunjukkan tipe anggota:

masukkan deskripsi gambar di sini



3

Salah satu opsinya adalah menggunakan metode ekstensi helper seperti berikut:

public static class MyExtensions
{
    public static System.Type Type<T>(this T v)=>typeof(T);
}

var i=0;
console.WriteLine(i.Type().FullName);

0

GetType() metode

int n=34;
Console.WriteLine(n.GetType());
string name="Smome";
Console.WriteLine(name.GetType());

0

lihat salah satu cara sederhana untuk melakukan ini

// Read string from console
        string line = Console.ReadLine(); 
        int valueInt;
        float valueFloat;
        if (int.TryParse(line, out valueInt)) // Try to parse the string as an integer
        {
            Console.Write("This input is of type Integer.");
        }
        else if (float.TryParse(line, out valueFloat)) 
        {
            Console.Write("This input is of type Float.");
        }
        else
        {
            Console.WriteLine("This input is of type string.");
        }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.