web-gelistirme-sc.com

Bir değişkenin veri tipini C # ile nasıl alabilirim?

Bir değişkenin hangi veri tipini tuttuğunu nasıl öğrenebilirim? (örneğin, int, string, char, vb.)

Şimdi böyle bir şey var:

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;
        }
    }
}
67
Limeni

Diğer cevaplar bu soruya iyi yardım eder, ancak hiçbirinin doğrudan ele almadığı önemli ve ince bir konu var. C # tipini düşünmenin 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 derleme zamanı bir kavramdı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.

Çalışma zamanı türü, bellekteki bir nesnenin türüdür. Bu nedenle çalışma zamanı bir kavramdır. Bu, GetType() yönteminin döndürdüğü türdür.

Bir nesnenin çalışma zamanı türü, onu tutan veya döndüren değişkenin, özellik veya yöntemin statik türünden sık sık farklıdır. Örneğin, şöyle bir kod olabilir:

object o = "Some string";

Değişkenin statik tipi object'dır, ancak çalışma zamanında değişkenin Referent tipi string'dir. Bu nedenle, sonraki satır konsola "System.String" yazacaktır:

Console.WriteLine(o.GetType());

Ancak, geliştirme ortamınızdaki o değişkeninin üzerine gelindiğinde, System.Object (veya eşdeğer object anahtar kelimesi) türünü görürsünüz.

int, double, System.Guid gibi değer türü değişkenleri için, çalışma zamanı türünün her zaman statik türle aynı olacağını, çünkü değer türlerinin başka bir tür için temel sınıf olarak hizmet edemediğini; Değer türünün miras zincirinde en fazla türetilmiş tür olması garanti edilir. Bu, mühürlü referans türleri için de geçerlidir: statik tip mühürlü bir referans tipi ise, çalışma zamanı değeri bu türün bir örneği olmalı veya null olmalıdır.

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

Bunu kodda 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));
88
phoog

Genel olarak konuşursak, yansıma veya arayüzlerle ilgili bir şey yapmazsanız, hiçbir zaman tür karşılaştırmaları yapmanız gerekmez. Yine de:

Karşılaştırma yapmak istediğiniz türü biliyorsanız, is veya as operatörlerini kullanın:

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

as operatörü bir istisna yerine başarısız olursa null döndüren 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, is kullanmanıza gerek kalmadan bir değişkeni bildirmek için as operatörünü kullanabilirsiniz:

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

Önceden bunu yapmak zorundaydınız:

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

Çok basit

variable.GetType().Name

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

9
Sagar Chavan
4
Stephen Oberauer

Sadece imleci ilgilendiğiniz üyenin üzerine getirin ve araç ipucuna bakın - notun türünü gösterecektir:

enter image description here

4

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);
1
Acerby

PHP ve C # sözdizimsel olarak birbirleriyle ilişkilidir ancak soruya değerinde cevap verebilirken (Bu makaleye bakınız http://msdn.Microsoft.com/en-us/library/58918ffs(v=vs.71). aspx ) Jeffrey Richter'ın C # (Üçüncü veya ikinci basım) üzerinden CLR bir kopyasını almanızı ve okumanızı şiddetle tavsiye ediyorum. Programlama ile ilgili en iyi kitap, şimdiye kadar türünüzle ilgili tüm soruları okuduğumu ve cevaplayacağımı ve kaputun altında neler olup bittiğini çok derinlemesine anladığımı düşünüyorum.

1
bUKaneer

GetType() yöntemi

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

bunu yapmanın basit yollarından birini 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.");
        }
0
KiranSolkar