An index is identified by its signature, while a property is identified by its name. An indexer is always an instance member, but a property can be static. An indexer is accessed through element access, while a property is accessed through member access. Extension methods allow custom functions to be added to existing types through static classes and a new syntax. Events allow classes to notify other classes when something happens by invoking event handler methods. Abstract classes can have both abstract and concrete members, while interfaces only contain implicitly abstract members that must be implemented in derived classes.