C # 'da bir değişkenin veri türünü nasıl alabilirim?


96

Bir değişkenin hangi veri türünü tuttuğunu nasıl öğrenebilirim? (ör. int, string, char, vb.)

Şimdi böyle bir şeye sahibim:

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
Türü zaten tanımladınız -int
Jamiec

Bu, "veri türünü bul" ile ne demek istediğin açık değil. Normalde cevap "sadece sınıf üyesinin imzasına bakarsınız ve tip orada açık bir şekilde belirtilir" dir. Niyetiniz sınıf üyelerini çalışma zamanında incelemek mi?
Wiktor Zychla

1
Konu dışı, ama burada yazdıklarınız C #: class Person { public string Name { get; set; } }veya ile böyle yazılsa daha iyi olur class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }. Özellikler
Steve B

1
Jamiec haklı. Statik yazım, bildirimin türünüzü sonsuza kadar belirlediği anlamına gelir. Değişken n, yalnızca belirttiğiniz türde veya devralınan türde olabilir. Özel durumunuzda, bir int görüntülemeyi seçtiniz, bu miras alamayacağınız bir türdür, bu nedenle n yalnızca bir int olabilir.
Ksempac

Yanıtlar:


126

Hiçbirinin doğrudan değinmediği önemli ve ince bir konu var. C # dilinde yazıyı göz önünde bulundurmanın iki yolu vardır: statik tip ve çalışma zamanı tipi .

Statik tür , kaynak kodunuzdaki bir değişkenin türüdür. Bu nedenle bir derleme zamanı kavramıdır. Bu, geliştirme ortamınızdaki bir değişkenin veya özelliğin üzerine geldiğinizde bir araç ipucunda gördüğünüz türdür.

Yazım çıkarımının sizin için onu halletmesine izin vermek için yardımcı genel yöntem yazarak statik türü elde edebilirsiniz:

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

Çalışma zamanı türü , bellekteki bir nesnenin türüdür. Bu nedenle bir çalışma zamanı kavramıdır. Bu GetType()yöntem tarafından döndürülen türdür .

Bir nesnenin çalışma zamanı türü, onu tutan veya döndüren değişken, özellik veya yöntemin statik türünden sıklıkla farklıdır. Örneğin, aşağıdaki gibi bir koda sahip olabilirsiniz:

object o = "Some string";

Değişkenin statik türü object, ancak çalışma zamanında değişkenin referansının türü string. Bu nedenle, sonraki satır konsola "System.String" yazdıracaktır:

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

Ancak, ogeliştirme ortamınızda değişkenin üzerine gelirseniz, türü System.Object(veya eşdeğer objectanahtar kelimeyi) görürsünüz . Yukarıdan yardımcı işlevimizi kullanarak da aynısını görüyorsunuz:

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

Gibi değer-tipi değişkenler için int, double, System.Guid, sen değer türleri başka türü için temel sınıf olarak hizmet edemez, çünkü çalışma zamanı türü her zaman statik türü olarak aynı olacağını biliyoruz; değer türünün, miras zincirinde en çok türetilmiş tür olduğu garanti edilir. Bu aynı zamanda mühürlü referans türleri için de geçerlidir: Statik tip mühürlü bir referans tipiyse, çalışma zamanı değeri ya bu tipin bir örneği veya null.

Tersine, değişkenin statik türü soyut bir türse, statik türün ve çalışma zamanı türünün farklı olacağı garanti edilir.

Bunu kodla göstermek için:

// 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
bu nedenle variable.getType()çalışma zamanı türünü (sağ taraf türü) döndürür, ancak statik türü (değişkenin sol taraf türü) döndüren nedir?
barlop

Derleme zamanında bilinen @barlop. typeofStatik tür için çalışma zamanında bir tür nesnesi almak için kullanabilirsiniz .
phoog

evet statik tür = derleme zamanı türü ve çalışma zamanı türü = dinamik tür biliyorum. Yeniden 'a' değişkenin türünü alma rağmen, yapamaz typeof(a) bunu yaparsanız typeof(int)o int dönecek ama değişken 'a' işaretleyerek ve size 'a' .. Sen söyleyebiliriz tipini gösterilmiyor sen misin 'a' statik türünü göstermeye gerek yok, öyle olabilir, ama gerçek şu ki onu göstermiyor. Yani burada typeof kullanımının ne kadar yararlı olduğunu anlamıyorum.
barlop

4
@barlop bunu sizin için yazım çıkarımının sizin için halletmesine izin vermek için yapabilirsiniz:Type GetStaticType < T > (T x) { return typeof(T); }
phoog

1
@Jaquarh, fark etmiş olabileceğiniz gibi, switchartık tür testi için desen eşleştirmeyi destekliyor (statik değil çalışma zamanı türünde). GetType () 'dan döndürülen değeri açmak yerine, değişkeni doğrudan açarsınız.
phoog

19

Çok basit

variable.GetType().Name

değişkeninizin veri türünü döndürür


17

Genel olarak konuşursak, yansıtma veya arayüzlerle bir şey yapmadığınız sürece neredeyse hiç tip karşılaştırması yapmanız gerekmeyecek. Her şeye rağmen:

Karşılaştırmak istediğiniz türü biliyorsanız, isveya asoperatörlerini kullanın :

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

asOperatör döner bir istisna ziyade başarısız olursa boş bir döküm gerçekleştirir:

TypeIKnow typed = unknownObject as TypeIKnow;

Türü bilmiyorsanız ve yalnızca çalışma zamanı tür bilgilerini istiyorsanız, .GetType () yöntemini kullanın:

Type typeInformation = unknownObject.GetType();

Daha yeni C # sürümlerinde, isoperatörü aşağıdakileri kullanmaya gerek kalmadan bir değişken bildirmek için kullanabilirsiniz as:

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

Önceden bunu yapmanız gerekirdi:

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

4

İmleci ilgilendiğiniz üyenin üzerinde tutmanız yeterlidir ve ipucuna bakın - üye türünü gösterecektir:

görüntü açıklamasını buraya girin



3

Bir seçenek, aşağıdaki gibi bir yardımcı uzatma yöntemi kullanmak olacaktır:

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() yöntem

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

0

bunu yapmanın basit yollarından birine göz atın

// 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.");
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.