Местоположение директивы 'использования' имеют значение в C#?

Мы можем пройтись по каждому пункту и передать массив «показателей» в функцию средней суммы.

«Оценки» уже в формате массива. Приведенная ниже функция (calculate_average_score) использует функцию php array_sum, которая суммирует элементы массива. count возвращает количество элементов в массиве. Таким образом, чтобы получить среднее значение - просто разделите одно на другое.

<?php

$people =
[
    [
        'name'   => 'Jim',
        'scores' => [1,2,3]
    ],
    [
        'name'   => 'Derek',
        'scores' => [4,5,6]
    ]
];

function calculate_average_score(array $scores) {
   return array_sum($scores)/count($scores);
}

foreach($people as $person)
{
    printf(
        "%s's average score is %d.\n", 
        $person['name'],
        calculate_average_score($person['scores'])
    );
}

Вывод:

Jim's average score is 2.
Derek's average score is 5.

В качестве альтернативы мы могли бы создать новый массив из нашего оригинала с именами и счетами в качестве ключей и значений, используя array_column. Затем мы можем обработать каждое из этих значений (оценки массива) с помощью функции с array_map:

$name_scores   = array_column($people, 'scores', 'name');
$name_averages = array_map('calculate_average_score', $name_scores);

print_r($name_averages);

Вывод:

Array
(
    [Jim] => 2
    [Derek] => 5
)
5
задан Hosam Aly 13 January 2009 в 08:37
поделиться

4 ответа

Я раньше думал, что это не имело значения, но я всегда полностью определяю команды использования.

Править: Проверенный спецификация C#, разделите 9.4, говорит что:

Объем директивы использования конкретно не включает свои директивы использования однорангового узла. Таким образом директивы использования однорангового узла не влияют друг на друга, и порядок, в котором они записаны, незначителен.

Таким образом, если Система. Наборы. Универсальный и KeyValuePair рассматриваются как коллег затем, KeyValuePair собирается проигнорировать Систему. Наборы. Универсальный.

6
ответ дан 18 December 2019 в 14:52
поделиться

Да, это делает - до маленькой степени. Существует пограничный случай, чтобы сделать с обзором / локальные имена, видеть блог Eric Lippert.

Для конкретного примера (конкретный для искажения использования):

using System;
using Foo = Bar;
public static class Bar {
    public  static void Test() { Console.WriteLine("outer"); }
}
namespace MyNamespace {
    //using Foo = Bar;

    public static class Bar {
        public static void Test() { Console.WriteLine("inner"); }
    }
    static class Program {
        static void Main() {
            Foo.Test();
        }
    }
}
5
ответ дан 18 December 2019 в 14:52
поделиться

Да это делает, у меня есть рабочий пример к подобному вопросу (Конфликты пространства имен).

В сущности правила для поиска имени отличаются, если директива использования глобальна (вне пространства имен) или в пространстве имен, когда это берет более высокий приоритет.

1
ответ дан 18 December 2019 в 14:52
поделиться

Это чисто информационно, ре один из ответов, утверждая, что это влияет на время, когда блок загружается; но в действительности, блоки загружаются в первый раз, когда метод/тип с помощью них является JITted (или получил доступ через отражение, и т.д.).

Вот пример, показывающий его имеющий значение; с using в любом месте вывод является тем же: System.Core загружается как Bar получает JITted:

pre-Bar
System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
pre-Max
Max: 5
post-Max
post-Bar

пример (выполненный в командной строке, не в отладчике; идеально в конфигурации выпуска):

using System;
//using System.Linq;
namespace Foo {
    using System.Linq;
    class Program {
        static Program() {
            AppDomain.CurrentDomain.AssemblyLoad += (s, a) => {
                Console.WriteLine(a.LoadedAssembly.FullName);
            };
        }
        static void Main() {            
            Console.WriteLine("pre-Bar");
            Bar();
            Console.WriteLine("post-Bar");
            Console.ReadLine();
        }
        static void Bar() {
            Console.WriteLine("pre-Max");
            int[] data = { 1, 2, 3, 4, 5 };
            Console.WriteLine("Max: " + Enumerable.Max(data));
            Console.WriteLine("post-Max");
        }
    }
}
1
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

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