2015-05-17 6 views
1

Я начинающий/промежуточный программист, идущий от Java до C#, и немного читал о функциях на codeproject.com. Я понимаю, что пространство имен в C# эквивалентно пакетам в java. Использование пространства имен совпадает с импортом пакета, хотя возможно иметь вложенное пространство имен. Классы существуют в пространствах имен, а методы существуют внутри классов. Но где-то я читал, что функции не зависят от класса? Тогда функции не методы? Означает ли это, что в C# вы можете определять функции вне классов в пространствах имен и использовать их как методы в классе после импорта пространства имен? В практическом использовании, скажем, если я пытаюсь написать Math Library, было бы лучше написать функции или статические методы? Есть ли разница в использовании между этими двумя?Уточнение функций - это свойство, специальный код, другое слово для процедуры/подпрограммы или более одного определения?

Как вы можете сказать, я также немного смешался с фактическим определением функции. Является ли это свойством (математическое свойство, где каждый вход имеет один вывод), который может иметь любой код? Если да, значит ли это, что статические методы также являются функциями (если они не зависят от переменной вне ее области)? Является ли это особым типом метода/подпрограммы, определяемым с помощью синтаксиса delegate/other, который может передаваться как параметры и присваиваться переменным? Ответы на вопрос о переполнении стека difference between methods and functions, похоже, немного отличаются, и принятый ответ отличается от лучших результатов поиска в googling.

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

+1

Это зависит от используемых определений.В общем случае * метод * является * типом функции *, связанной с экземпляром. Таким образом, методы * являются * функциями с дополнительным свойством/ограничением. Однако другие виды * «функций» * (т. Е. Func, Action, delegate в C#) являются «независимыми» от любого экземпляра. Свойства вообще не считаются функциями вообще (хотя некоторое свойство может представлять/оценивать функции, а «get'-свойства в C# могут выполнять произвольный код ..). – user2864740

+0

@ user2864740 Боги, функции сбивают с толку. Таким образом, функция здесь отличается от математического определения функции тогда (часть из одного входа одного выхода)? Независимо от того, имеете ли вы в виду, что они могут использоваться вне класса или что они должны быть объявлены в классе, но могут быть доступны без создания экземпляра класса? – Ellyl

+0

Только функциональные языки программирования обычно придерживаются более строгого определения, Haskell является одним из лучших примеров. В других языках функция обычно представляет собой «некоторый« предопределенный код », который вызывается для создания материала, который может возвращать значение и/или выполнять другие побочные эффекты». Не так аккуратно :) – user2864740

ответ

0

Давайте будем простыми. Независимо от того, какое определение функций на C# или Java у вас есть:

  • Пакет или пространство имен, которое может содержать только классы; не функции, ни методы.
  • В классе есть методы, которые будут служить функциями в том смысле, что они получают параметры и могут выдавать результаты.
  • У вас могут быть статические методы, как на Java, так и на C#. Эти методы зависят от класса, но не зависят от объекта, то есть они вызываются непосредственно из класса без экземпляра объекта.
  • Есть также объекты, называемые лямбда-выражениями. Это объекты, которые определяются как функции. Они используются в функциональном программировании.

И это в значительной степени. Нет функций, определенных непосредственно из пакетов или пространств имен, так как пакетов в пакетах и ​​пространств имен в пространствах имен нет.

Для библиотеки Math вы можете определить общедоступный класс Math со всеми его функциями или в нашем случае статическими методами. Таким образом, вы бы позвонили: Math.sin(..), Mas.cos(...) и т. Д.

Обратите внимание, что лямбда-выражения служат для облегчения некоторых областей программирования, таких как: выражения SQL в коде, фильтрация коллекций и т. Д.

Наконец, обратите внимание, что выражения лямбда не следует путать с методами, принадлежащими классу. Я бы предложил хорошее чтение из MSDN под названием Lambda Expressions. Это чтение облегчило бы понимание такой приятной, но плотной темы.

+0

Получил это. Часть о независимости классов должна быть от C. Какое из многих определений вы ссылаетесь, когда говорите «методы, которые будут выполнять функции по вашему определению»? Не все методы выполняют математическое определение функции, поскольку они могут зависеть от глобальных переменных, которые могут быть разными. В учебнике функции отмечены делегатом. Это только особый тип метода? Являются ли методы помечены как статические и делегируют обе функции? – Ellyl

+0

Я исправил ту часть, где я сказал «по вашему определению» .... это просто несправедливо, чтобы выразить это так. В учебнике по кодированию, упомянутом в вопросе, речь идет о лямбда-функциях, которые на самом деле являются объектами, которые действительно являются функциями. – EduardoFernandes

+0

Я считаю, что ваше замешательство оправдано, потому что вы взяли такую ​​плотную статью для чтения. Я предложил бы вам начать с чего-то более легкого, например, статьи, упомянутой в ответе: https://msdn.microsoft.com/en-us/library/vstudio/bb397687%28v=vs.110%29.aspx – EduardoFernandes