Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


enum och typecast

Postades av 2007-05-15 18:28:57 - Pelle Johansson, i forum c# (c-sharp), Tråden har 14 Kommentarer och lästs av 1410 personer

Hej, jag må vara förvirrad men en sak förstår jag inte och det är varför jag måste casta om något som redan är integer? Kan någon ge mig ljus över detta?

public enum Customers : int
    {
        Expressen = 1,
        Aftonbladet = 2
    }


För att sedan kunna använda detta så måste jag skriva:

if (CurrentCustomer == (int)Customers.Expressen)
        {
            panelExpressenSelection.Visible = true;
            lstObject.Items[12].Enabled = false;
        }


Att göra denna cast verkar ju överknäppt - eller


Svara

Sv: enum och typecast

Postades av 2007-05-15 18:58:59 - Per Persson

Det är inte precis en förklaring till varför man har gjort så, men det är dokumenterat hos Microsoft:
<info>The underlying type specifies how much storage is allocated for each enumerator. However, an explicit cast is needed to convert from enum type to an integral type.</info>
http://msdn2.microsoft.com/en-us/library/sbbt4032(VS.80).aspx

Den angivna typen (int) skall nog inte ses som en basklass utan bara som en specifikation av lagringstyp. Därför blir inte Customers en subklass till int, och alltså är Expressen inte ett int, även om det lagras som ett int.


Svara

Sv:enum och typecast

Postades av 2007-05-15 20:17:07 - Patrik Löwendahl

Därför att enumerationer ärver från Enum, inte från int. En explcit cast triggar då Explicit cast operatorn och gör det väldigt tydligt i din kod vad det är för något.

Dessutom behöver inte alla enums vara int, de kan vara short eller long också. Vilket gör det ännu viktigare att man är tydlig.


Svara

Sv: enum och typecast

Postades av 2007-05-15 20:19:56 - Patrik Löwendahl

Förresten, varför sparar du kunder i en enum? Det låter inte helt flexibelt.


Svara

Sv: enum och typecast

Postades av 2007-05-15 20:47:03 - Martin Adrian

if (CurrentCustomer == (int)Customers.Expressen)


>Att göra denna cast verkar ju överknäppt - eller

Varför är inte CurrentCustomer av typen Customer?


Svara

Sv:enum och typecast

Postades av 2007-05-15 20:56:11 - Pelle Johansson

I det här fallet var det ett exempel rörande 2 konstanter.. Jo, currentcustomer är av typen customer som är en funktion av typen int men det syns inte i exemplet. Det är castningen som jag ifrågasatte och funderade på och tycker det är "overhead" ..


Svara

Sv: enum och typecast

Postades av 2007-05-16 09:06:56 - Martin Adrian

>Jo, currentcustomer är av typen customer som är en funktion av typen int men det syns inte i exemplet.

Det jag menar är att om currentcustomer är av (enum-)typen Customers så behöver du ingen cast.

>Det är castningen som jag ifrågasatte och funderade på och tycker det är "overhead" ..

Jo men casting behövs ju alltid när man skall jämföra två olika typer. I många fall är den implicit (t.ex. int, double) men i andra fall är det explicit. Poängen med att kräva explicit cast är ju att det skall synas i koden att man vet vad man gör.
(Sen kan man ju diskutera om inte alla casts egentligen borde vara explicita förutom derived->base)

I C är konverteringen mellan enum och int implicit men de flesta är överrens om att det inte är bra så i nästa c++ standard har man ändrat så det fungerar som i C#.

>if (CurrentCustomer == (int)Customers.Expressen)

Den här raden är bara så fel. Antingen ser du till att CurrentCustomer är av enumtyp eller också använder du konstanter istället:

  public static class Customers {
    public const int Expressen = 1;
    public const int Aftonbladet = 2;
  };


Svara

Sv: enum och typecast

Postades av 2007-05-16 10:57:08 - Roger Alsing

Det är ju ganska intressant problem
men iaf.

En enum är en klass i .net

tex din enum blir i kompilerad form:

.class public auto ansi sealed Customer
extends [mscorlib]System.Enum
{
.field public static literal valuetype ConsoleApplication18.Customer Expressen = int32(1)
.field public static literal valuetype ConsoleApplication18.Customer Aftonbladet = int32(2)
.field public specialname rtspecialname int32 value__
}

dvs en klass som innehåller två konstanter (ok inte äkta konstanter men iaf)
och ett publikt instansfält av samma typ som värdena i din enum, i det här fallet en int32

överstatt från IL till c# så blir det:

public sealed class Customer : enum
{
public static readonly int Expressen = 1;
public static readonly int Aftonbladet = 2;
public int value__;
}

När man ser detta så blir det ju inte så konstigt längre
du jämför alltså en int32 med en instans av din Customer klass.


Svara

Sv:enum och typecast

Postades av 2007-05-16 11:05:19 - Patrik Löwendahl

och här trodde jag hela tiden att enum var en struct inte en klass, eller hur var det nu roggan? ;)


Svara

Sv: enum och typecast

Postades av 2007-05-16 11:11:05 - Simon Dahlbacka

allting heter .class i MSIL http://weblogs.asp.net/kennykerr/archive/2004/09/09/introduction-to-msil-part-3-defining-types.aspx


Svara

Sv:enum och typecast

Postades av 2007-05-16 11:15:13 - Patrik Löwendahl

Jo jag är medveten om det, men det är inte samma sak som att det "är en klass i .net". Det är en "klass i IL" kanske men inte i .NET.


Svara

Sv: enum och typecast

Postades av 2007-05-16 11:16:04 - Simon Dahlbacka

ok, jag missade din poäng första gången..


Svara

Sv:enum och typecast

Postades av 2007-05-16 11:18:01 - Patrik Löwendahl

Det var för att det var en dryg kommentar till Roggan ;)


Svara

Sv: enum och typecast

Postades av 2007-05-17 10:56:44 - Roger Alsing

*host* det var pseudo c# kod ;-)*/host*

men självklart :) , eftersom enum ärver valuetype så är det struct i c#
mitt kodexempel ger ju kompileringsfel , men det skulle ju även ge kompileringsfel om du skrv struct eftersom enum inte går att ärva själv (i c#)..
så det var mer för att visa vad för kod som skapas av enums.

Aktare så jag inte kommer o ställer taskiga frågor på devsummit ;-)


Svara

Sv:enum och typecast

Postades av 2007-05-17 11:11:14 - Patrik Löwendahl

Det vågar du aldrig :P


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 718
27 958
271 751
3 286
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies