Существует ли больше к C# “как” ключевое слово, чем простой кастинг?

Благодаря Сержу, я смог собрать свой код, который приведен ниже.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// create a struct, call it pupils
typedef struct
{
    char *name;
    char *dorm;
}
pupils;

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
    // allocate memory for idinfo[i] pointers:
        idinfo[i].name = malloc(20);
        idinfo[i].dorm = malloc(20);

        printf("Enter student %d's Name ", i+1); 
        scanf("%19s", idinfo[i].name);

        printf("Enter student %d's dorm ", i+1);
        scanf("%19s", idinfo[i].dorm);
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
    // free allocated memory
    for (int i = 0; i < enrollment; i++)
    {
        free(idinfo[i].name);
        free(idinfo[i].dorm);
    }
}
11
задан Edward Tanguay 21 April 2009 в 08:57
поделиться

6 ответов

как вернет объект типа, который вы запрашивается, если операнд совместим. Если это не так, он вернет ноль . Если вы используете в качестве и возможно, что приведение не удастся, вам нужно проверить, чтобы убедиться, что ссылка действительна.

Например, если depObj был типа String , он не будет нулевым , но он также не сможет быть преобразован ни в один из запрошенных типов, и обе эти переменные станут нулевыми .

26
ответ дан 3 December 2019 в 01:29
поделиться

как и «приведение, если оно есть», и эквивалентно:

(X - ТИП)? (TYPE) X: null

, однако, он более эффективен, чем , является + cast .

depObj может реализовывать любой интерфейс, ни одного, или оба.

5
ответ дан 3 December 2019 в 01:29
поделиться
IsValid = _fe != null || _fce != null;

и

IsValid = depObj != null;

не являются одинаковыми тестами, потому что, если depObj не относится к типу FrameworkElement или FrameworkContentElement, но не имеет значение null, второй тест вернет true, а первый вернет false.

4
ответ дан 3 December 2019 в 01:29
поделиться

Что если depObj не является ни FrameworkElement , ни FrameworkContentElement ? Я не знаю полного сценария (то есть, какие типы могут быть), но это кажется разумной защитной стратегией.

2
ответ дан 3 December 2019 в 01:29
поделиться

Что, если DependencyObject depObj действительно был FrameworkOtherTypeOfElement

Тогда depObj не будет нулевым

, но попытка as Приведения приведут к нулевому значению, а _fe & _fce будут равны нулю

, так как эквивалентно выполнению

if(I Can Cast This Object)
   //Then cast it
else
   //Return null
1
ответ дан 3 December 2019 в 01:29
поделиться

Во-первых, ключевое слово as включает в себя проверку is .

if( o is A)
   a = (A) o;

совпадает с

a = o as A;

Second, как ] не преобразует тип, как это делает приведение, даже если определен оператор преобразования из типа A в B .

2
ответ дан 3 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: